🐢
과제1) 나만의 언어로 객체 지향의 특징 설명하기
July 24, 2023
어제 첫 라이브 세션을 시작으로 스진초 과정이 시작되었다! 프로그래밍은 외우는 것이 아니라 생각하고 이해하면서 해야한다고 말씀해주셨는데, 첫 과제부터 스진초의 정체성이 잘 나타나는거 같다.
내가 생각하는 캡슐화, 추상화, 다형성, 상속성
최근에 자바의 정석을 읽으면서 내용정리를 했기때문에 과제를 보고 ‘ㅎ..할만하군..’ 이라고 생각했다. 하지만 지금 이 글을 적는 이 순간 머리속에 있는 꺼내려고 하니까 쉽지않다. 그래도 최대한 적어봐야지..!
캡슐화
- 데이터의 무분별한 변경을 방지하기 위해서 접근제어자를 private으로 선언하여 외부의 접근을 막는 방식
추상화
- 추상 클래스를 상속받은 하위 클래스에게 메소드의 작성을 위임하는 방식
다형성
- 상위 클래스의 타입으로 하위 클래스의 인스턴스를 참조할 수 있도록 하는 방식
상속
- 공통된 속성을 모아놓은 클래스(상위 클래스)를 확장하여 새로운 클래스(하위 클래스)를 정의하는 방식
구글링으로 알아낸 캡슐화, 추상화, 다형성, 상속성
캡슐화
- 변수와 메소드를 하나의 단위로 묶는 것, 클래스를 통해서 캡슐화가 이루어진다.
- 클래스의 인스턴스를 생성하여 변수에 접근할 수 있다.
정보은닉
- 캡슐화에 정보은닉이 동반되도록 프로그램을 구현하는 경우가 많아서 두 개념이 자주 혼동된다.
- 클래스 외부에서 특정 메소드에만 접근이 가능하게 하여 내부가 어떤식으로 처리되는지 모르게 하고 데이터의 무분별한 변경을 방지한다.
class Person{
private String name; //private으로 선언해 외부에서 접근이 안되도록한다.
public void setName(String name){
this.name = name; // 데이터 변경은 setter를 통해서 진행한다.
}
}
추상화
- 객체의 공통적인 속성과 기능을 추출하여 정의하는것
다형성
- 하나의 객체가 여러가지 타입을 가질 수 있는 것을 의미
- 참조변수의 타입이 참조변수가 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 갯수를 결정한다.
상속
- 기존 클래스에 기능을 추가하거나 재정의 하는것을 의미
//추상화 된 추상클래스
public abstract class Animal {
String name; //공통적인 속성
int age; //공통적인 속성
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public void move() {System.out.println("이동한다");} //공통적인 기능
public void eat() {System.out.println("먹는다");} //공통적인 기능
public abstract void bark(); //짖는 소리는 동물마다 다르므로 추상메서드로 생성
}
//추상 클래스를 상속 받음
public class Dog extends Animal{
String feed; // 해당 클래스만의 속성
public Dog(String name, int age, String feed) {
super(name, age);//상위클래스의 생성자 호출
this.feed = feed;
}
public String getFeed() {
return feed;
}
public void setFeed(String feed) {
this.feed = feed;
}
//메서드 오버라이딩
//추상 클래스를 상속받으면 추상 메소드를 구현해주어야한다.
@Override
public void bark() {
System.out.println("멍!");
};
}
public class example {
public static void main(String[] args) {
Animal a = new Dog("초코", 3, "강아지 전용 맛있는 사료"); //다형성
//인스턴스의 참조타입이 상위클래스이므로
a.bark(); //상위클래스에 있는 메소드를 사용할 수 있다.
//a.setFeed(); 하위클래스에 있는 메소드를 사용하면 에러가 발생한다.
Dog d = new Dog("재롱이", 7, "맛없는 사료");
d.move(); //Animal을 상속받았기 때문에 해당 메소드 사용 가능
//인스턴스의 타입이 Dog이기 때문에 Dog클래스에 정의된 메소드 사용 가능
d.setFeed("몸에 좋은 사료");
}
}
내용을 작성하고 보니 내 머릿속에는 추상화와 상속에대한 개념이 섞여져 있는것으로 보인다. 다시한번 정리해보자! 추상화는 객체의 공통적인 기능을 추출하여 정의하는 것이고 자바에서는 추상클래스와 인터페이스로 표현하고 있다. 상속은 기존 클래스에 기능을 추가하거나 재정의 하는 것을 의미한다. 두 특징 모두 코드의 중복을 줄이고 유지보수에 좋다. 그리고 아직 다형성에 대한 장점이 크게 와닿지 않는다. 개념을 잘 이해하고 있으면 언젠가 아! 하는날이 오지 않을까?