Skip to content
This repository was archived by the owner on Sep 2, 2023. It is now read-only.

Latest commit

 

History

History
28 lines (18 loc) · 1.8 KB

File metadata and controls

28 lines (18 loc) · 1.8 KB

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

인터페이스 상속와 구현 상속

구현 상속: 클래스가 다른 클래스를 확장하는 상속
인터페이스 상속: 클래스가 인터페이스를 구현하거나 인터페이스가 다른 인터페이스를 확장하는 상속

구현 상속의 문제점

캡슐화를 깨뜨린다.
상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다.

  • 상위 클래스는 릴리스마다 내부 구현이 달라질 수 있으며, 그 여파로 하위 클래스가 오동작할 수 있다.
  • 하위 클래스는 상위 클래스의 변화에 발맞춰 수정돼야만 한다.
  • 상위 클래스에 새로운 메서드가 추가되었을 경우, 하위 클래스에서 재정의 못한 그 새로운 메서드로 인해 오동작 할 수 있다.
  • 메서드 재정의시, 하위 클래스에서 접근할 수 없는 상위 클래스의 private 필드를 써야 하는 상황이라면 구현 자체가 불가능하다.
  • 상위 클래스에 새 메서드가 추가됐는데, 하위 클래스에 추가한 메서드와 시그니처가 같을 경우가 발생할 수 있다.

구현 상속의 해결방안: 컴포지션(Composition)

기존 클래스를 확장하는 대신, 새로운 클래스를 만들고 private 필드로 기존 클래스의 인스턴스를 참조한다.

새 클래스의 인스턴스 메서드(전달메서드, forwarding method)들은 기존 클래스의 대응하는 메서드를 호출해 그 결과를 반환(전달, forwarding)한다.

구현 상속의 문제 해결

  • 새로운 클래스는 기존 클래스의 내부 구현 방식의 영향에서 벗어난다.
  • 기존 클래스에 새로운 메서드가 추가되더라도 전혀 영향을 받지 않는다.