상속의 한계
- 캡슐화가 깨지고 결합도가 높아짐
- 유연성 및 확장성이 떨어짐
- 클래스 폭발
-----> 상속 대신 합성 사용 권장
합성이란
- 다른객체의 인스턴스를 자신의 인스턴스 변수로 포함해서 메서드를 호출하는 기법이다.(필드로 클래스의 인스턴스를 참조= forwarding method)
- 다른객체의 인스턴스이므로 인터페이스를 이용하면 Type을 바꿀 수 있다.
- 부모클래스가 없으면 자식클래스도 없다.즉, 자식 클래스가 부모 클래스에 종속됨. (cf. 반면, Aggregation 집합관계의 경우 부모클래스가 없어도 자식 클래스는 존재한다.)
- 구현에 의존하지 않고 내부에 포함되는 객체의 구현이 아닌 인터페이스에 의존.
- 두 객체 사이의 의존성은 런타임에 해결(상속의 경우, 컴파일 타임에 해결)
- 개체 사이의 동적인 관계
class Child{
private int num;
}
class Parent{
private Child chi;
public Parent(){
chi = new Child()
}
}
합성 사용 케이스
- 부모와 자식 클래스가 Has - A 관계인 경우
- 클래스 간의 관계가 확실하게 정해져 있지 않을 때(상속은 Is-A)
참고
클래스관계
코드의 재사용, 상속보다 합성을 사용해야 하는 이유
상속을 자제하고 합성(Composition)을 이용하자
OOP Concepts for Beginners: What is Composition?