-
item 18 상속보다는 컴포지션을 사용하라책/이펙티브 자바 2022. 3. 4. 23:41
ITEM 18 상속보다는 컴포지션을 사용하라
구현 상속은 위험하다
상속은 코드를 재사용하는 강력한 수단이지만 모든 경우에 최선은 아니다
상위 클래스와 하위 클래스를 모두 같은 프로그래머가 통제하는 패키지 안에서라면 상속도 안전하다
확장할 목적으로 설계되었고 문서화도 잘 되어 있다면 이것도 괜찮다
####하지만 일반적인 구체 클래스를 패키지 경계를 넘어 다른 패키지의 구체 클래스를 상속하는 일은 위험하다
이번 아이템의 상속은 이러한 구현 상속을 말한다
(인터페이스 상속과는 무관하다)메서드 호출과 달리 상속은 캡슐화를 깨뜨린다
- 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다
상속은 상위 클래스와 하위 클래스가 순수한 is-a 관계일 경우에만 사용해야한다
- is-a 관계인 경우에도 하위 클래스의 패키지가 상위 클래스와 다르거나 상위 클래스의 확장 여부에 따라 문제가 생길 수 있다
상속의 문제점을 해결하려면 컴포지션과 전달을 사용하자
- 래퍼 클래스로 구현할 적당한 인터페이스가 있다면 더욱 고려하자
- 래퍼 클래스는 하위 클래스보다 견고하고 강력하다
- 래퍼 클래스는 단점이 거의 없고 콜백 프레임워크에서만 self문제가 있다
컴포지션은 기존 클래스가 새로운 클래스의 구성 요소로 쓰이는걸 말한다
- 기존 클래스를 확장하는게 아닌 새로운 클래스를 생성하여 private 필드로 기존 클래스의 인스턴스를 참조하는 것 과 같은 방식
- 새 클래스의 인스턴스 메서드들은 private 필드로 참조하는 기존 클래스에 대응하는 메서드를 호출해 결과를 반환한다(전달 : forwarding)
- 이러한 메서드를 전달 메서드라고 한다(forwarding method)
- 새 클래스의 인스턴스 메서드들은 private 필드로 참조하는 기존 클래스에 대응하는 메서드를 호출해 결과를 반환한다(전달 : forwarding)
- 컴포지션과 전달을 사용하면 기존 클래스의 내부 구현에 전혀 영향을 받지 않게된다
- 만약 새로운 메서드가 추가 되더라도 전혀 영향받지 않는다
'책 > 이펙티브 자바' 카테고리의 다른 글
item 20 추상 클래스보다는 인터페이스를 우선하라 (0) 2022.03.08 item 19 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 (0) 2022.03.07 item 17 변경 가능성을 최소화하라 (0) 2022.03.03 item 16 public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 (0) 2022.03.02 item 15 클래스와 멤버의 접근 권한을 최소화하라 (0) 2022.03.01