Open eternalklaus opened 1 year ago
컴포지션과 전달 개념이 좀 헷갈려서 찾고 정리해봤습니다.
Composition(조합||구성) 기존의 클래스를 확장(상속)하는 대신, 새로운 클래스를 만들고 private필드로 기존 클래스의 인스턴스를 참조하게 해서 기능 확장할 수 있는 방법
전달(forwardig) 새 클래스의 인스턴스 메소드들은 (private 필드로 참조하는) 기존 클래스의 메소드(전달 메소드. forwarding method)를 호출하고 그 결과를 반환하는 방식
상속 개념이 단순하지만 단순하지 않은 개념이었네요
[Item18] 상속보다는 컴포지션을 사용하라
Intro
잘못된 예 - 상속을 잘못 사용했다!
HashMap 기능을 사용하면서, 생성된 이후 몇개의 원소가 더해졌는지 알 수 있는 기능을 추가한 클래스를 구현
getAddCount
를 호출하면 3이 반환될 것 같지만 실제로는 6을 반환한다.addAll
은 각 원소마다add
를 호출하게 구현이 되어있다.HashSet
의addAll()
메서드를 확인하기 전까진 그 이유를 알 수 없습니다.이 예제의 경우, addAll 메서드를 재정의하지 않거나, 다른 식의 재정의를 통해 문제를 해결할 수 있다.
addAll
을 사용하는 경우)addAll
을 재정의 하는 경우)다음 릴리스에서 상위 클래스에 새로운 메서드를 추가한다면?
문제들을 해결할 좋은 방법이 있다!
컴포지션이란?
기존 클래스를 확장하지 않고, 새로운 클래스를 만든 후, private 필드로 기존 클래스의 인스턴스를 참조하게 하도록 설계하는 방법이다.
→ 기존 클래스가 새로운 클래스의 구성요소로 쓰이게 되는 구조
HashMap 예제를 컴포지션으로 변환
아래는 재사용할 수 있는 전달클래스인 ForwardingSet
용어
컴포지션의 장점
컴포지션의 단점
래퍼 클래스와 SELF 문제
상속과 is-a
핵심 정리