선생님, 개발을 잘하고 싶어요.

[오브젝트] 챕터 11 - 합성과 유연한 설계 본문

일상/책 리뷰

[오브젝트] 챕터 11 - 합성과 유연한 설계

알고싶은 승민 2022. 3. 20. 19:00

상속의 문제점을 지적하며 합성의 장점을 설명하는 챕터입니다.

조합의 폭발적인 증가는 실제로 경험해 본 적이 없지만 부주의하게 상속을 사용하는 경우 당연히 발생할 것 같습니다. (실제로 경험 안해보는 게 정신 건강에 좋을 것 같네요.)

합성을 사용하는 게 컴파일타임 의존성과 런타임 의존성을 다르게 설정할 수 있는 방법이라는 걸 알게되었습니다. 지금까지 저자가 강조했던 것 처럼 유연한 설계를 위해서는 이 둘의 차이가 있어야 한다고 했던 지점과 일치하는 듯 하네요.

 

하지만 결국 합성만이 만능키라는 게 아니고 상속이 가지고 있는 문제 (컴파일타임에 의존성을 런타임에 못 바꿈)을 해결할 수 있다면 mixin과 같은 방법도 좋아보입니다.

 

상속, 합성, 믹스인 모두 도구일 뿐이라는 점을 상기시키는 것 같습니다.


  •  도입
    • 상속
      • 부모 자식간 의존성을 컴파일타임에 해결
      • is-a 관계
      • 부모의 구현에 의존한다.
      • 클래스 사이의 정적인 관계
    • 합성
      • 두 객체 사이의 의존성을 런타임에 해결
      • has-a 관계
      • 구현에 의존하지 않는다.
      • 객체 사이의 동적인 관계
  • 상속을 합성으로 변경하기
  • 상속으로 인한 조합의 폭발적인 증가
    • 작은 기능을 조합해서 더 큰 기능을 수행하는 객체를 만들어야 하는 경우
      • 기능 추가나 수정을 위해 불필요하게 많은 수의 클래스를 추가, 수정 하게 된다.
    • 이러한 기능 들은...
      • 선택적으로 적용되는 기능
      • 조합 가능한 기능
      • 임의의 순서로 적용할 기능
    • 추상 메서드: 자식 클래스에서 오버라이딩할 의도로 만든 메서드
    • 훅 메서드: 기본 동작을 제공하면서도 오버라이딩할 의도로 만든 메서드
    • 클래스 폭발 문제: 상속의 남용으로 하나의 기능을 추가하기 위해 필요 이상으로 많은 수의 클래스를 추가하게 되는 경우
  • 합성 관계로 변경하기
    • 상속 → 컴파일타임 의존성과 런타임 의존성을 동일하게 만들거야!
    • 합성을 사용하면 런타임에 객체 사이의 의존성 변경이 자유롭다.
    • 기능을 조합하기 위해서 컴파일타임 의존성을 변경하는 게 아니라 런타임 의존성을 변경하는 형태로 접근 할 수 있다.
    • 오직 하나의 클래스만 추가하고 런타임에 필요한 정책들을 조합해서 원하는 기능을 얻을 수 있다.
    • 합성이 상속(구현 상속)보다 좋은 방법이다.
  • 믹스인
    • 컴파일 시점에 필요한 코드 조각을 조합하는 재사용 방법
    • 코드를 다른 코드 안에 유연하게 섞어 넣을 수 있으면 믹스인
    • super 참조가 가리키는 대상이 컴파일 시점이 아닌 실행 시점에 결정된다.
      • 일반 상속은 super는 선언한 클래스의 부모 클래스를 가리킨다. 즉 컴파일 타임에 결정되는 부분이다.
      • super를 동적으로 바인딩
Comments