상속에서 부모 클래스와 자식 클래스 사이의 의존성은 컴파일타임에 해결

합성은 두 객체 사이의 의존성을 런타임에 해결

상속과 합성은 코드 재사용이라는 동일한 목적을 가진다.

앞장에서 살펴본 것처럼 상속은 부모 클래스의 내부 구현을 상세히 알아야 하기 때문에 결합도가 높아지고 이 때문에 좋은 방법이라고 할 수 없다.

합성은 내부에 포함되는 객체의 구현이 아닌 퍼블릭 인터페이스에 의존한다. → 합성을 이용해 포함한 객체 내부 구현이 변경되더라도 영향을 최소화 할 수 있음. → 변경에 더 안정적인 코드를 얻을 수 있음.

상속은 부모 클래스 안에 구현된 코드 자체를 재사용하지만 합성은 객체의 퍼블릭 인터페이스를 재사용한다. → 상속 대신 합성을 사용하면 구현에 대한 의존성을 인터페이스에 대한 의존성으로 변경할 수 있다. → 높은 결합도에서 낮은 결합도로 변경됨

상속의 문제점 세 가지

  1. 불필요한 인터페이스 상속 문제
  2. 메서드 오버라이딩의 오작동 문제
  3. 부모 클래스와 자식 클래스의 동시 수정 문제 → 이건 합성으로도 커버가 안되긴한다.

상속으로 인한 조합의 폭발적인 증가

코드 중복이 생기니까 재사용을 위해 상속을 써보자 → 자연스러운 생각

중복 코드의 덫에 걸리다

상속으로 하려다보니 요구사항에 따라 자식 클래스를 조합별로 만들어야한다. → 클래스 폭발!