Link
Today
Total
12-01 18:54
Archives
관리 메뉴

초보개발자 긍.응.성

(이펙티브 자바 3) 18. 상속보다는 컴포지션을 사용하라 본문

책 정리/이펙티브 자바 3

(이펙티브 자바 3) 18. 상속보다는 컴포지션을 사용하라

긍.응.성 2020. 10. 17. 23:44
반응형

상속(extends)과 컴포지션에 대하여 알아보자.

상속 (inheritance)

상속은 코드를 재사용하는 강력한 수단이다. 하지만 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 된다.

상속의 위험성

  • 캡슐화를 깨뜨린다.
  • 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다.
  • 상위 클래스의 수정이 하위 클래스가 영향을 끼친다.
  • 새로운 메서드가 추가된다면 하위 클래스에서 의도에 맞게 동작하도록 수정하여야 한다.

컴포지션 (Composition)

앞서 상속을 사용할 때 일어날 수 있는 위험성에 대하여 이야기하였다. 하지만 컴포지션을 통해 앞서 본 문제들을 피해 갈 수 있다.

컴포지션은 기존 클래스새로운 클래스의 구성요소로 쓰인다는 것을 의미한다. 새로운 클래스는 컴포지션을 이용할 때 메서드에서 기존 클래스가 제공하는 메서드를 호출하여 결과를 반환한다. 이 방식을 전달(forwarding)이라 하며, 새 클래스의 메서드들을 전달 메서드(forwarding method)라 부른다. 컴포지션과 전달의 조합은 더 넓은 의미로 위임(delegation)이라고 부른다.

컴포지션을 사용함으로써 새로운 클래스는 기존 클래스의 내부 구현 방식의 영향에서 벗어나며, 기존 클래스에 새로운 메서드가 추가되더라도 전혀 영향받지 않는다.

래퍼 클래스 (Warpper class)

  • 다른 인스턴스를 감싸고 있는 클래스.
  • 컴포지션은 새로운 클래스가 기존 클래스를 구성요소로 갖기 때문에 래퍼 클래스이다.

상속을 사용해야 할 때

  • 상속은 반드시 하위 클래스가 상위 클래스의 '진짜' 하위 타입인 상황일 때
  • 확장하려는 클래스의 API에 아무런 결함이 없을 때
  • 확장하려는 클래스에 결함이 있더라도 이 결함이 구현하려는 클래스 API에 전파되어도 괜찮을 때

컴포지션을 사용해야 할 상황에 상속을 사용하여 발생할 수 있는 문제

  • 컴포지션을 사용해야 할 때 상속을 사용하면 내부 구현을 불필요하게 노출하게 된다.
  • 클래스의 API가 내부 구현에 묶이고, 성능도 제한된다.
  • 노출된 내부에 클라이언트가 직접 접근할 수 있기에, 혼란을 야기할 수 있다.
  • 상위 클래스를 직접 수정하거나 상위 클래스의 메서드를 직접 호출하여, 상위 클래스의 불변식을 해칠 수 있다.

정리

상속은 코드 재사용성의 면에서 강력함을 갖고 있지만 캡슐화를 해친다. 상속을 사용할 상황이 아니거나, 상황을 파악하지 못하는 상태라면 최대한 컴포지션을 사용하여 일어날 수 있는 문제를 피하며 안전하게 하도록 하자.

반응형
Comments