상속은 객체지향적이고, 코드의 재사용을 줄여주는 강력한 수단이다.
그러나, 다른 패키지의 구체 클래스를 상속하는 경우 문제가 발생할 수 있다.
문제점
하위 클래스에서 재정의한 메서드를 상위 클래스에서 수정하거나, 새로운 메서드를 추가하면 의도치 않은 동작을 할 수 있다.
하위 클래스에서 추가한 메서드의 시그니처와 상위 클래스에서 이후에 추가한 메서드의 시그니처가 겹치면 컴파일조차 되지 않는다.
따라서 private 필드로 직접 객체의 참조값을 이용하는 컴포지션을 활용하여 문제를 해결할 수 있다.
상속과 컴포지션을 고민한다면 다음 질문을 생각해보자.
하위 클래스는 정말 상위 클래스인가? (cat 은 animal 인가?) - 애매하거나 답이 '아니오' 라면 컴포지션을 활용하자.
상위 클래스의 api에는 결함이 없는가? - 컴포지션은 결함을 해결할 수 있지만, 상속은 결함까지 승계한다.