Effective Java

이펙티브 자바 완벽 공략 2부

아이템 18 - 상속보다는 컴포지션을 사용하라

상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아니다.
상위 클래스와 하위 클래스를 모두 같은 프로그래머가 통제하는 패키지 안에서라면 안전하다.
확장할 목적으로 설계되었고 문서화도 잘 된 클래스도 마찬가지로 안전하다.

구현 상속의 문제점



해결방안



컴포지션을 써야 할 상황에서 상속을 사용하는 건 내부 구현을 불필요하게 노출하는 꼴이다.
그 결과 API가 내부 구현에 묶이고 그 클래스의 성능도 영원히 제한된다.
더 심각한 문제는 클라이언트가 노출된 내부에 직접 접근할 수 있다는 점이다.

컴포지션 대신 상속을 사용하기로 결정하기 전에 확인해라.
1) 확장하려는 클래스의 API에 아무런 결함이 없는가?
2) 결함이 있다면, 이 결함이 새 클래스의 API까지 전파돼도 괜찮은가?

컴포지션으로는 이런 결함을 숨기는 새로운 API를 설계할 수 있지만,
상속은 상위 클래스의 API를 ‘그 결함까지도’ 그대로 승계한다.



출처

이펙티브 자바 3/E
이펙티브 자바 완벽 공략 2