-
상속과 합성은 재사용 기법
-
상속 관계(is-a 관계)
-
합성 관계(has-a 관계)
-
합성을 이용하면 좀 더 안정적인 코드를 얻을 수 있다.
- 합성 관계는 실행 시점에 동적으로 변경될 수 있기 때문이다.
-
코드 재사용을 위해서 객체 합성이 클래스 상속보다 더 좋은 방법이다.
-
합성은 포함되는 객체의 퍼블릭 인터페이스를 재사용한다.
- 높은 결합도를 낮은 결합도로 대체할 수 있다.
-
클래스 상속
- 화이트박스 재사용
- 부모 클래스의 내부가 자식 클래스에 공개되기 때문
-
객체 합성
- 블랙박스 재사용
- 객체 내부는 공개되지 않고 인터페이스를 통해서만 재사용
01 상속을 합성으로 변경하기
- 상속을 남용하면...
- (1) 불필요한 인터페이스 상속 문제
- (2) 메서드 오버라이디의 오작용 문제
- (3) 부모 클래스와 자식 클래스와 동시 수정 문제
불필요한 인터페이스 상속문제:java.util.Properties와 java.util.Stack
메서드 오버라이딩의 오작용 문제: IntrsumentedHashSet
- 결합도는 제거하면서 퍼블릭 인터페이스는 그대로 상속받을 수 있는 방법 → 인터페이스를 사용
부모 클래스와 클래스의 동시 수정 문제: PersonalPlaylist
상속과 비교해서 합성은 안정성과 유연성이라는 장점을 제공한다.
02 상속으로 인한 조합의 폭발적인 증가
합성을 사용하면 상속으로 인해 발생하는 클래스의 증가와 중복 코드의 문제를 간단하게 해결할 수 있다.
기본 정책과 부가 정책 조합하기
상속을 이용해서 기본 정책 구현하기
기본 정책에 세금 정책 조합하기
- super 호출
- 자식 클래스와 부모 클래스의 결합도가 높아진다.
- 이러한 결합도를 낮추는 방법은 부모 클래스에 추상 메서드를 제공하는 것이다.(템플릿 메서드 패턴 생각하면 될 듯)
- 다만 추상 메서드의 경우 모든 자식클래스를 오버라이딩해주어야 한다.
- 자식 클래스가 많아진다면 → 그만큼 번거로움이 발생한다.
- 이 때 기본 구현을 제공한다면 해당 문제를 극복할 수 있다.
- hook method
- 자식 클래스에서 오버라이딩할 의도로 메서드를 추가했지만 편의를 위해 기본 구현을 제공하는 메서드
기본 정책에 기본 요금 할인 정책 조합하기
중복 코드의 덫에 걸리다.
- 상속 남용
- 필요 이상으로 많은 수의 클래스를 추가
- "클래스 폭발" 또는 "조합의 폭발"이라고도 한다.
03 합성 관계로 변경하기
- 상속 관계는 컴파일타임에 결정되고 고정
- 합성은 컴파일타임 관계를 런타임 관계로 변경함
- 합성을 사용하면 구현 시점에 정책들이 관계를 고정시킬 필요가 없으며 실행 시점에 정책들의 관계를 유연하게 변경할 수 있게 된다.
- 단, 런타임 의존성의 거리가 멀면 멀수록 설계의 복잡도가 상승하기 때문에 코드를 이해하기 어려워진다.
기본 정책 합성하기
- 다양한 종류의 객체와 협력하기 위해 합성 관계를 사용하는 경우에는 합성하는 객체의 타입을 인터페이스나 추상 클래스로 선언하고 의존성 주입을 사용해 런타임에 필요한 객체를 설정할 수 있도록 구현하는 것이 일반적이다.
부가 정책 사용하기
기본 정책과 부가 정책 합성하기
새로운 정책 추가하기
- 더 중요한 것은 요구사항을 변경할 때 오직 하나의 클래스만 수정해도 된다는 것이다.
객체 합성이 클래스 상속보다 더 좋은 방법이다
04 믹스인
- 믹스인
- 객체를 생성할 때 코드 일부를 클래스 안에 섞여 넣어 재사용하는 기법
- 코드를 다른 코드 안에 섞어 넣기 위한 방법
- 코드 재상요에 특화된 방법이면서도 상속과 같은 결합도 문제를 초래하지 않는다.
- 어떤한 방법이던 코드를 다른 코드 안에 유연하게 섞어 넣을 수 있다면 믹스인이라고 할 수 있다.
기본 정책 구현하기
트레이트로 부가 정책 구현하기
- 믹스인은 제약을 둘뿐 실제로 어떤 코드에 믹인될 것인지를 결정하지 않는다.
부가 정책 트레이트 믹스인하기
- 믹스인은 재사용 가능한 코드를 독립적으로 작성한 후 필요한 곳에서 쉽게 조합할 수 있게 한다.
쌓을 수 있는 변경
- 믹스인을 추상 서브클래스라고 부르기도 한다.
- 특정한 클래스에 대한 변경 또는 확장을 독립적으로 구현한 후 필요한 시점에 차례대로 추가할 수 있다.
- 이러한 특징을 쌓을 수 있는 변경이라고 한다.