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