💡우아한테크코스 인터뷰 과정에서 받았던 질문 중인 상속과 조합의 차이에 대하여 정리하였습니다.
개요
- 상속과 조합은 객체지향 프로그래밍에서 객체 간의 관계를 모델링하는 중요한 개념입니다.
- 두 개념은 코드 재사용과 객체 간의 관계를 명확히 하는 데 도움을 줍니다.
- “상속보다 조합을 사용하라”라는 말이 있는데, 그 이유를 알아보려 합니다.
상속(Inheritance)
- 상속은 자식 클래스가 부모 클래스의 속성과 메서드를 물려받는 개념입니다.
- 부모 - 자식 관계를 형성하며, 자식 클래스는 부모 클래스의 기능을 확장하거나 재정의할 수 있습니다.
is - a
- 상속은 A는 B이다(A is B)라는 관계를 나타내며, 자식 클래스는 부모 클래스의 일종으로 간주합니다.
- 이를 활용하면 부모 클래스에서 정의된 속성 및 메서드를 자식 클래스에서 재사용할 수 있기 때문에 코드 재사용성이 증가합니다.
장점 키워드
- 코드 재사용성, 가독성 증가, 상위 클래스의 기능 확장
단점 키워드
- 클래스 간의 결합도 증가, 어려운 디버깅, 유연성 부족
조합(Composition)
- 조합은 객체가 다른 객체를 포함하여 서로 협력하는 방식입니다.
- 객체는 다른 객체를 소유하거나 그 객체의 메서드를 사용합니다.
has - a
- 조합은 A는 B를 가지고 있다(A has B)의 관계를 나타내며, 클래스는 다른 클래스의 인스턴스를 소유합니다.
장점 키워드
- 낮은 결합도, 재사용성, 확장성, 높은 유연성
단점 키워드
- 복잡성 증가, 일관성 감소, 객체의 수 증가
정리
캡슐화를 깨뜨리고 상위 클래스에 의존하게 되어 객체의 변화에 유연하지 못한 상속을 사용하기 보다 조합을 사용하는 것이 좋습니다. 하지만 무조건 조합이 좋은 것은 아니며, 상속을 적절하게 사용한다면 유지보수성이 증대될 수 있습니다.
상속이 좋은 경우
- 확장과 설계를 고려한 is - a 관계
- 예를 들어서 ~은 ~이다, “홍길동은 사람이다”와 같은 관계에서는 상속의 이점이 극대화 됩니다.
- 그 이유는 변할 가능성이 없는 관계이기 때문이며, 일관성이 적절하게 유지되는 관계라고 볼 수 있습니다.