상속 vs 합성
합성은 전체를 표현하는 객체가 부분을 표현하는 객체를 포함해서 부분 객체의 코드를 재사용한다.
상속에서 부모 자식 클래스간의 의존성은 컴파일 타임에 해결되지만, 합성에서는 런타임에 해결된다.
상속 관계는 is-a 관계, 합성 관계는 has-a 관계라고 부른다.
클래스 상속은 화이트박스 재사용이라고 부르는데, 이는 부모 클래스의 내부가 자식 클래스에게 곤개되기 때문이다.
반대로 합성은 블랙박스라 재사용이라고 부른다. 객체의 내부는 공개되지 않고 인터페이스를 통해서만 재사용되기 때문이다.
상속으로 인한 클래스 폭발
상속은 부모 자식간의 결합도를 높이고, 코드를 수정하는데 필요한 작업량이 과도하게 늘어날 수 있다.
일반적으로 다음 두 가지 문제점이 발생한다.
- 하나의 기능을 추가하거나 수정하기 위해 불필요하게 많은 수의 클래스를 추가하거나 수정
- 단일 상속만 지원하는 언어의 경우 상속으로 인해 오히려 중복 코드가 증가할 수 있음
10장의 핸드폰 과금 시스템에 새로운 요구사항이 추가되었다고 가정해보자.
부가 정책을 추가하는 것이다.
만약 Phone을 중심으로 경우의 수를 상속으로 해결한다면 클래스의 개수가 폭발적으로 증가한다.
이처럼 상속의 남용으로 하나의 기능을 추가하기 위해 필요 이상으로 많은 수의 클래스를 추가해야 하는 문제를 클래스 폭발 문제라고 부른다.
합성은 컴파일 타임 관계를 런타임 관계로 바꿈으로써 이 문제를 해결한다.
합성을 사용하면 구현이 아닌 퍼블릭 인터페이스에 대해서만 의존할 수 있기 때문이다.
이를 통해 OCP를 지킬 수 있게 된다.
이와 달리 합성은 조합을 구성하는 요소들을 개별 클래스로 구현한 후 실행 시점에 인스턴스를 조립하는 방법이다.
'CS > OOP' 카테고리의 다른 글
[오브젝트] 12장 - 상속의 목적은 서브타입 다형성 (0) | 2024.02.22 |
---|---|
[오브젝트] 10장 : 상속의 문제점과 추상화 (1) | 2024.02.05 |
[오브젝트] 9장 : 유연한 설계를 하려면 OCP, DIP를 지켜라 (0) | 2024.02.01 |
[오브젝트] 8장 - 좋은 의존성과 나쁜 의존성 (0) | 2024.01.29 |
[오브젝트] 7장 : 기능 분해의 측면에서 본 OOP (1) | 2024.01.23 |