초보개발자 긍.응.성
(이펙티브 자바 3) 18. 상속보다는 컴포지션을 사용하라 본문
반응형
상속(extends)과 컴포지션에 대하여 알아보자.
상속 (inheritance)
상속은 코드를 재사용하는 강력한 수단이다. 하지만 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 된다.
상속의 위험성
- 캡슐화를 깨뜨린다.
- 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다.
- 상위 클래스의 수정이 하위 클래스가 영향을 끼친다.
- 새로운 메서드가 추가된다면 하위 클래스에서 의도에 맞게 동작하도록 수정하여야 한다.
컴포지션 (Composition)
앞서 상속을 사용할 때 일어날 수 있는 위험성에 대하여 이야기하였다. 하지만 컴포지션을 통해 앞서 본 문제들을 피해 갈 수 있다.
컴포지션은 기존 클래스
가 새로운 클래스
의 구성요소로 쓰인다는 것을 의미한다. 새로운 클래스는 컴포지션을 이용할 때 메서드에서 기존 클래스가 제공하는 메서드를 호출하여 결과를 반환한다. 이 방식을 전달(forwarding)
이라 하며, 새 클래스의 메서드들을 전달 메서드(forwarding method)
라 부른다. 컴포지션과 전달의 조합은 더 넓은 의미로 위임(delegation)
이라고 부른다.
컴포지션을 사용함으로써 새로운 클래스는 기존 클래스의 내부 구현 방식의 영향에서 벗어나며, 기존 클래스에 새로운 메서드가 추가되더라도 전혀 영향받지 않는다.
래퍼 클래스 (Warpper class)
- 다른 인스턴스를 감싸고 있는 클래스.
- 컴포지션은 새로운 클래스가 기존 클래스를 구성요소로 갖기 때문에 래퍼 클래스이다.
상속을 사용해야 할 때
- 상속은 반드시 하위 클래스가 상위 클래스의 '진짜' 하위 타입인 상황일 때
- 확장하려는 클래스의 API에 아무런 결함이 없을 때
- 확장하려는 클래스에 결함이 있더라도 이 결함이 구현하려는 클래스 API에 전파되어도 괜찮을 때
컴포지션을 사용해야 할 상황에 상속을 사용하여 발생할 수 있는 문제
- 컴포지션을 사용해야 할 때 상속을 사용하면 내부 구현을 불필요하게 노출하게 된다.
- 클래스의 API가 내부 구현에 묶이고, 성능도 제한된다.
- 노출된 내부에 클라이언트가 직접 접근할 수 있기에, 혼란을 야기할 수 있다.
- 상위 클래스를 직접 수정하거나 상위 클래스의 메서드를 직접 호출하여, 상위 클래스의 불변식을 해칠 수 있다.
정리
상속은 코드 재사용성의 면에서 강력함을 갖고 있지만 캡슐화를 해친다. 상속을 사용할 상황이 아니거나, 상황을 파악하지 못하는 상태라면 최대한 컴포지션을 사용하여 일어날 수 있는 문제를 피하며 안전하게 하도록 하자.
반응형
'책 정리 > 이펙티브 자바 3' 카테고리의 다른 글
(이펙티브 자바 3) 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라 (0) | 2020.10.27 |
---|---|
(이펙티브 자바 3) 22. 인터페이스는 타입을 정의하는 용도로만 사용하라 (0) | 2020.10.22 |
(이펙티브 자바 3) 21. 인터페이스는 구현하는 쪽을 생각해 설계하라 (0) | 2020.10.20 |
(이펙티브 자바 3) 20. 추상 클래스보다는 인터페이스를 우선하라 (0) | 2020.10.19 |
(이펙티브 자바 3) 17. 변경 가능성을 최소화하라 (0) | 2020.10.16 |
(이펙티브 자바 3) 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 (0) | 2020.10.10 |
(이펙티브 자바 3) 15. 클래스와 멤버의 접근 권한을 최소화하라 (0) | 2020.10.09 |
(이펙티브 자바 3) 14. Comparable을 구현할지 고려하라 (0) | 2020.10.04 |
Comments