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

강준혁·2022년 9월 20일
0

오브젝트

목록 보기
12/14
post-thumbnail

상속과 합성은 재사용의 대상이 다르다.
상속은 부모 클래스 안에 구현된 코드 자체를 재사용하지만 합성은 포함되는 객체의 퍼블릭 인터페이스를 재사용한다.

상속대신 합성을 사용하면 구현에 대한 의존성을 인터페이스에 대한 의존성으로 변경할 수 있다.

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

상속으로 인해 결합도가 높아지면 코드를 수정하는데 필요한 작업의 양이 과도하게 늘어나는 경향이 있다.
가장 일반적 상황은 작은 기능들을 조합해서 더 큰 기능을 수행하는 객체를 만들어야 하는 경우로 다음과 같은 문제점이 발생한다.

  • 하나의 기능을 추가하거나 수정하기 위해 불필요하게 많은 수의 클래스를 추가하거나 수정해야 한다.
  • 단일 상속만 지원하는 언어에서는 상속으로 인해 오히려 중복코드의 양이 늘어날 수 있다.

클래스 폭발

휴대폰 요금제를 계산하는 클래스의 예를 보자.

부모 클래스 Phone 이 있고 이를 상속받아 일반적인 요금제/야간 요금제에 대한 추가적인 구현을 하는 RegularPhone 과 NightlyPhone이 있다.

여기에서 각각에 대해 세금에 대한 계산을 추가적으로 해야 하는 경우,

RegularPhone 과 NightlyPhone을 각각 상속받는 자식 클래스를 생성해야 하고, 또 다른 정책이 추가되는 경우 그 조합의 수에 비례하여 자식 클래스가 또 생성되어야 한다.

즉, 여러 객체간의 조합에 대한 다형성의 표현이 부자연스럽게 이루어진다.

이처럼 상속의 남용으로 하나의 기능을 추가하기 위해 필요 이상으로 많은 수의 클래스를 추가해야 하는 경우를 클래스 폭발 또는 조합의 폭발 문제라고 한다.

이는 자식 클래스가 부모 클래스의 구현에 강하게 결합되도록 강요하는 상속의 근본적인 한계때문에 발생하는 문제이다.

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

합성은 컴파일타임 관계를 런타임 관계로 변경함으로써 상속의 단점들을 해결한다.
합성을 사용하면 구현이 아닌 퍼블릭 인터페이스에 대해서만 의존할 수 있기 때문에 런타임에 객체의 관계를 변경할 수 있다.

상속이 조합의 결과를 개별 클래스 안으로 밀어 넣는 방법이라면 합성은 조합을 구성하는 요소들을 개별 클래스로 구현한 후 실행 시점에 인스턴스를 조립하는 방법을 사용하는 것이라고 할 수 있다.

profile
백엔드 개발자

0개의 댓글