이펙티브 자바 #item18 상속보다는 컴포지션을 활용하라

임현규·2023년 1월 19일
0

이펙티브 자바

목록 보기
18/47
post-thumbnail

상속의 위험성

상속은 객체지향에서 강력한 도구 중 하나이다. 상속을 통해 코드를 재사용하고, 템플릿 패턴으로 활용할 수 있다. 물론 문서화가 잘 되어 있고, 명확하게 확장할 목적으로 사용하면 굉장히 좋지만 일반적으로 상속은 캡슐화를 깨뜨릴 위험이 있다.

다른 패키지에서 접근 가능한 문제점

상속은 java에서 protected를 이용해 재사용할 수 있다. 그러나 protected는 private과 package-private과는 다르게 다른 패키지에서도 상속해서 사용할 수 있다.

캡슐화를 깨기 때문에 발생하는 부작용

다른 곳에서 내부 구현을 가져와 쓸 수 있다. 이것의 문제점은 상위 클래스가 릴리즈마다 내부 구현이 달라질 수 있고, 그로 인해 한 줄도 건드리지 않는 하위 클래스가 문제가 생길 가능성이 있다. 이런 이유 때문에 확장을 충분히 고려하고 상위 클래스를 설계해야하고 하위 클래스는 상위 클래스에 맞게 수정되어야 한다.

컴포지션을 활용하라

객체를 설계한다는 것은 자신의 상태를 스스로 자율적으로 관리함에 있다. 상태는 premitive 타입일 수도 있지만 컬렉션일 수도 있고 클래스를 자율적으로 관리하기도 한다. DDD에서는 애그리거트라 하여 엔티티와 엔티티(객체)간의 연결을 컴포지션을 활용한다. is-a 관계 조차도 이 컴포지션으로 설계가 가능하다.

상속 유의점

상속은 강력하지만 캡슐화를 해친다는 문제가 있다. 또한 상위 API가 결함이 있다면 하위 클래스도 결함이 생길 위험이 있다. 이러한 이유로 상속은 상위 클래스와 하위 클래스가 순수한 is-a 관계일 때로 제한해서 써야 한다. 이러한 이유가 아니면 되도록 컴포지션을 활용한 랩퍼 클래스를 활용하는게 좋다.

profile
엘 프사이 콩그루

0개의 댓글