**상속보다 합성(composition over inheritance)**은 널리 인용되는 설계 원칙입니다 — 기반 클래스로부터 상속받는 것(상속)보다 행위를 결합하여(합성) 객체를 구축하는 것을 선호합니다. 상속은 합성이 피하는 중대한 단점을 가지고 있지만, 둘 다 각자의 자리가 있습니다.
상속 vs 합성
상속 → 클래스가 다른 클래스를 확장하여 그 행위를 상속 ("IS-A" 관계):
class Dog extends Animal
합성 → 클래스가 다른 객체/행위로부터 구축됨 ("HAS-A" / 사용):
class Car { constructor() { this.engine = new Engine(); } } // 행위를 합성
→ 합성: 더 작은 조각들을 결합; 상속: 부모로부터 파생
상속이 문제가 있는 이유
✗ 강한 결합 → 서브클래스가 부모의 구현에 강하게 묶임 (부모의 변경이 서브클래스를
깨뜨릴 수 있음 — "취약한 기반 클래스" 문제)
✗ 경직된 계층 → 깊고/넓은 상속 트리는 변경하고 이해하기 어려워짐
✗ 비유연 → 클래스는 보통 하나의 부모만 상속 가능; 행위가 컴파일 시점에 고정됨;
여러 소스에서 행위를 결합하기 어려움
✗ 진정으로 성립하지 않을 수도 있는 "IS-A" 관계를 강제함; 부모 내부를 노출
