728x90
상속
- 부모클래스에서 정의된 필드와 메소드를 자식이 물려받는 것
- 자식클래스에서 extends를 선언하여 상속을 받을 수 있으며, 부모클래스는 하나만 정의가 가능
- 객체지향프로그래밍의 특징인 캡슐화를 깨뜨림, 부모클래스의 정의가 변경되면, 하위클래스도 변경하기 때문
- 캡슐화를 깨뜨리는 단점때문에 왠만한 상황에서는 컴포지션으로 푸는 것이 좋음 (오류낼 가능성 있음)
컴포지션
- private 필드를 통하여 기존의 클래스가 새로운 클래스의 구성요소(인스턴스로)로 쓰이는 것
- 새로운 클래스에 기존 클래스의 영향이 적어, 기존 클래스가 변경되어도 안전함 (변화에 유연함)
예시
/* 부모클래스 */
public class Notebook {
public void on() {
System.out.println("전원동작");
}
}
/* 자식클래스 / 기존클래스 */
public class Macbook extends Notebook {
private final Keyboard checker;
/* 새로운 클래스를 기존클래스에 인스턴스 변수를 추가하여 사용 */
public Macbook(Keyboard checker) {
this.checker = checker;
}
}
/* 컴포지션으로 사용할 클래스 */
public class Keyboard {
public void keyStroke() {
System.out.println("키입력");
}
}
결론
- 상속을 사용하는 경우는 명확하게 기능이 정의된 경우, Is-a 관계가 완벽할 때 사용함
- 위와 같은 상황이 아닌 경우 Has-a 관계인 컴포지션으로 문제를 해결하는 것이 좋음
'JAVA' 카테고리의 다른 글
[JAVA] 상태패턴 (0) | 2021.05.21 |
---|---|
[JAVA] Builder 패턴 (0) | 2021.05.16 |
[JAVA] static 정리 (0) | 2021.05.15 |
[JAVA] 초기화 순서 (0) | 2021.05.12 |
[JAVA] Lombok @Delegate (0) | 2021.04.18 |