[아이템 18] 상속보다는 컴포지션을 사용하라
IT 개발/개념 정리
2022. 5. 14. 22:24
캡슐화를 깨는 상속을 지양하자.
- 상위 클래스가 릴리즈마다 변경될 경우 상속받는 하위클래스도 변경되어야하고 상위 클래스의 구현 방식에 따라 하위 클래스의 동작에 이상이 생길 수도 있다.
- 다음 릴리즈에 새로운 메서드가 추가될 때 하위 클래스에서 재정의하지 못한 새로운 메서드를 통해 '잘못된'객체를 컬렉션에 넣을 수 있다.
- 메서드 재정의가 아닌 새로운 메서드를 추가할 경우에도 다음 릴리즈에 상위 클래스에 하위 클래스에서 추가한 메서드와 시그니처가 같고 반환 타입이 다르면 하위 클래스는 컴파일되지 않는다. 동일한 메서드를 재정의한게 되더라도 상위 클래스의 메서드 규약을 만족하지 못할 가능성이 있다.
새로운 클래스를 만들고 private 필드로 기존 클래스의 인스턴스를 참조하게 하는 컴포지션을 사용하자.
- composition 설계 기법 : 기존 클래스가 새 클래스의 일부(component)로 구성되는 방식
- forwarding(전달) : 새로운 클래스에 포함된 각각의 메서드는 기존 클래스에 있는 메서드 가운데 필요한 것을 호출해서 그 결과를 반환
- forwarding method(전달 메서드) : 전달 기법을 사용해 구현된 메서드
컴포지션을 통해 구현된 클래스는 기존 클래스의 세부 구현에 종속되지 않기 때문에 견고하다.
컴포지션과 전달의 조합은 넓은 의미로 위임(delegation)이라고 부른다.
래퍼 클래스는 콜백 프레임워크와는 어울리지 않는다.
상속은 상위 클래스와 하위 클래스가 IS-A 관계일때만 사용하는 것이 좋다. 단, 상위 클래스가 계승을 고려하여 설계되었고 동일한 패키지내에 있어야 한다. 그렇지 않다면 구성과 전달 기법을 사용하는 것이 좋다.
반응형
'IT 개발 > 개념 정리' 카테고리의 다른 글
[아이템 20] 추상 클래스보다는 인터페이스를 우선하라 (0) | 2022.05.26 |
---|---|
[아이템 19] 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 (0) | 2022.05.21 |
[아이템 17] 변경 가능성을 최소화하라 (0) | 2022.05.14 |
[아이템 16] public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 (0) | 2022.05.14 |
[아이템 15] 클래스와 멤버의 접근 권한을 최소화하라 (0) | 2022.05.13 |