본문 바로가기
공부/이펙티브자바

[이펙티브자바]item 18.상속보다는 컴포지션을 사용하라.

by 띵커베르 2023. 2. 2.
728x90
  • 상속은 많은 문제가 발생할 수 있다.
  • 패키지 경계를 넘어, 즉 다른 패키지의 구체 클래스를 속하는 일은 위험하다.
    • 상속은 캡슐화를 깨뜨린다.
      • 깨뜨린다보다 상속을 받은 자식 클래스가 상위 클래스의 private 멤버에 접근할 수 있기때문에 캡슐화의 의도와 달리 구현이 공개 될 수 있게 된다.
    • 상위 클래스의 구현에따라 동작에 이상이 생길 수 있다.
  • 이를 해결하기 위해 컴포지션(Composition)을 사용하라는 얘기이다.
    • 컴포지션: 기존 클래스를 확장하는대신, 새로운 클래스를 만들고, private 필드로 기존 클래스의 인스턴스를 참조하게 한다.
      • 기존 클래스의 대응하는 메서드를 호출해 그 결과를 반환한다.
      • 이를통해 기존 클래스의 구현이 바뀌거나, 새로운 메서드가 생기더라도 아무런 영향이 받지 않는다.
  • 119p 래퍼클래스가 콜백 프레임워크와는 어울리지 않는다는 점만 주의하면 된다
    • 콜백 함수: 다른 함수의 인자로 전달된 함수를 받은 함수 내부에서 필요에따라 적절한 시점에 호출한다.
    • 자기 자신의 참조를 넘기고, 콜백 때는 래퍼가 아닌 내부 객체를 호출하게 된다
      • 래퍼 클래스로 감싼다 한들 실제 콜백히 호출하기전에는 자기 자신을 보내기때문에, 래퍼클래스는 넘어가지 않는다.
728x90

댓글