우선 상속이란 하위 클래스가 상위 클래스의 특성을 재정의한 것으로 부모 클래스의 메서드를 오버라이딩하여 자식에 맞게 재사용하는 등으로 상당히 많이 쓰이는 활용도 높은 개념
하지만 캡슐화 위반, 유연하지 못한 설계, 다중 상속 불가능 등의 단점이 존재하여 제대로 사용하지 않으면 유연성을 해칠 수 있음
컴포지션은 상속의 단점을 커버할 수 있음
컴포지션은 기존 클래스가 새로운 클래스의 구성요소가 되는 것으로 기존의 클래스를 확장하는 것이 아닌, 새로운 클래스를 생성하여 private 필드로 기존 클래스의 인스턴스를 참조하는 방식
새로운 클래스이기 때문에, 어떠한 생성 작업이 일어나더라도 기존의 클래스는 전혀 영향을 받지 않음
이때 원본 클래스를 wrapping하여 위임 역할을 하는 Wrapper Class가 필요하며 이러한 패턴을 데코레이터 패턴이라고 부름
/* ForwardingSet은 원본 클래스를 wrapping하여 위임 역할을 하는 Wrapper Class */
public class ForwardingSet<E> implements Set {
private final Set<E> set;
public ForwardingSet(Set<E> set){
this.set=set;
}
// Set 인터페이스를 오버라이딩 구현
}
/* CustomHashSet은 Set 인터페이스를 구현한 ForwardingSet을 상속하는 클래스 */
public class CustomHashSet<E> extends ForwardingSet {
public CustomHashSet(Set<E> set){
super(set);
}
// ForwardingSet을 오버라이딩 구현
}