오브젝트 - 11 합성과 유연한 설계

yshjft·2023년 6월 13일
0

오브젝트

목록 보기
11/18
  • 상속과 합성은 재사용 기법

  • 상속 관계(is-a 관계)

  • 합성 관계(has-a 관계)

  • 합성을 이용하면 좀 더 안정적인 코드를 얻을 수 있다.

    • 합성 관계는 실행 시점에 동적으로 변경될 수 있기 때문이다.
  • 코드 재사용을 위해서 객체 합성이 클래스 상속보다 더 좋은 방법이다.

  • 합성은 포함되는 객체의 퍼블릭 인터페이스를 재사용한다.

    • 높은 결합도를 낮은 결합도로 대체할 수 있다.
  • 클래스 상속

    • 화이트박스 재사용
    • 부모 클래스의 내부가 자식 클래스에 공개되기 때문
  • 객체 합성

    • 블랙박스 재사용
    • 객체 내부는 공개되지 않고 인터페이스를 통해서만 재사용

01 상속을 합성으로 변경하기

  • 상속을 남용하면...
    • (1) 불필요한 인터페이스 상속 문제
    • (2) 메서드 오버라이디의 오작용 문제
    • (3) 부모 클래스와 자식 클래스와 동시 수정 문제

불필요한 인터페이스 상속문제:java.util.Properties와 java.util.Stack

메서드 오버라이딩의 오작용 문제: IntrsumentedHashSet

  • 결합도는 제거하면서 퍼블릭 인터페이스는 그대로 상속받을 수 있는 방법 → 인터페이스를 사용

부모 클래스와 클래스의 동시 수정 문제: PersonalPlaylist

상속과 비교해서 합성은 안정성과 유연성이라는 장점을 제공한다.

02 상속으로 인한 조합의 폭발적인 증가

합성을 사용하면 상속으로 인해 발생하는 클래스의 증가와 중복 코드의 문제를 간단하게 해결할 수 있다.

기본 정책과 부가 정책 조합하기

상속을 이용해서 기본 정책 구현하기

기본 정책에 세금 정책 조합하기

  • super 호출
    • 자식 클래스와 부모 클래스의 결합도가 높아진다.
    • 이러한 결합도를 낮추는 방법은 부모 클래스에 추상 메서드를 제공하는 것이다.(템플릿 메서드 패턴 생각하면 될 듯)
    • 다만 추상 메서드의 경우 모든 자식클래스를 오버라이딩해주어야 한다.
      • 자식 클래스가 많아진다면 → 그만큼 번거로움이 발생한다.
      • 이 때 기본 구현을 제공한다면 해당 문제를 극복할 수 있다.
    • hook method
      • 자식 클래스에서 오버라이딩할 의도로 메서드를 추가했지만 편의를 위해 기본 구현을 제공하는 메서드

기본 정책에 기본 요금 할인 정책 조합하기

중복 코드의 덫에 걸리다.

  • 상속 남용
    • 필요 이상으로 많은 수의 클래스를 추가
    • "클래스 폭발" 또는 "조합의 폭발"이라고도 한다.

03 합성 관계로 변경하기

  • 상속 관계는 컴파일타임에 결정되고 고정
  • 합성은 컴파일타임 관계를 런타임 관계로 변경함
  • 합성을 사용하면 구현 시점에 정책들이 관계를 고정시킬 필요가 없으며 실행 시점에 정책들의 관계를 유연하게 변경할 수 있게 된다.
  • 단, 런타임 의존성의 거리가 멀면 멀수록 설계의 복잡도가 상승하기 때문에 코드를 이해하기 어려워진다.

기본 정책 합성하기

  • 다양한 종류의 객체와 협력하기 위해 합성 관계를 사용하는 경우에는 합성하는 객체의 타입을 인터페이스나 추상 클래스로 선언하고 의존성 주입을 사용해 런타임에 필요한 객체를 설정할 수 있도록 구현하는 것이 일반적이다.

부가 정책 사용하기

기본 정책과 부가 정책 합성하기

새로운 정책 추가하기

  • 더 중요한 것은 요구사항을 변경할 때 오직 하나의 클래스만 수정해도 된다는 것이다.

객체 합성이 클래스 상속보다 더 좋은 방법이다

04 믹스인

  • 믹스인
    • 객체를 생성할 때 코드 일부를 클래스 안에 섞여 넣어 재사용하는 기법
    • 코드를 다른 코드 안에 섞어 넣기 위한 방법
    • 코드 재상요에 특화된 방법이면서도 상속과 같은 결합도 문제를 초래하지 않는다.
    • 어떤한 방법이던 코드를 다른 코드 안에 유연하게 섞어 넣을 수 있다면 믹스인이라고 할 수 있다.

기본 정책 구현하기

트레이트로 부가 정책 구현하기

  • 믹스인은 제약을 둘뿐 실제로 어떤 코드에 믹인될 것인지를 결정하지 않는다.

부가 정책 트레이트 믹스인하기

  • 믹스인은 재사용 가능한 코드를 독립적으로 작성한 후 필요한 곳에서 쉽게 조합할 수 있게 한다.

쌓을 수 있는 변경

  • 믹스인을 추상 서브클래스라고 부르기도 한다.
  • 특정한 클래스에 대한 변경 또는 확장을 독립적으로 구현한 후 필요한 시점에 차례대로 추가할 수 있다.
    • 이러한 특징을 쌓을 수 있는 변경이라고 한다.
profile
꾸준히 나아가자 🐢

0개의 댓글