상속과 조합, 상속보다 조합을 활용하라

💡우아한테크코스 인터뷰 과정에서 받았던 질문 중인 상속과 조합의 차이에 대하여 정리하였습니다.

 

개요

  • 상속과 조합은 객체지향 프로그래밍에서 객체 간의 관계를 모델링하는 중요한 개념입니다.
  • 두 개념은 코드 재사용과 객체 간의 관계를 명확히 하는 데 도움을 줍니다.
  • “상속보다 조합을 사용하라”라는 말이 있는데, 그 이유를 알아보려 합니다.

상속(Inheritance)

  • 상속은 자식 클래스가 부모 클래스의 속성과 메서드를 물려받는 개념입니다.
  • 부모 - 자식 관계를 형성하며, 자식 클래스는 부모 클래스의 기능을 확장하거나 재정의할 수 있습니다.

is - a

  • 상속은 A는 B이다(A is B)라는 관계를 나타내며, 자식 클래스는 부모 클래스의 일종으로 간주합니다.
  • 이를 활용하면 부모 클래스에서 정의된 속성 및 메서드를 자식 클래스에서 재사용할 수 있기 때문에 코드 재사용성이 증가합니다.

장점 키워드

  • 코드 재사용성, 가독성 증가, 상위 클래스의 기능 확장

단점 키워드

  • 클래스 간의 결합도 증가, 어려운 디버깅, 유연성 부족

조합(Composition)

  • 조합은 객체가 다른 객체를 포함하여 서로 협력하는 방식입니다.
  • 객체는 다른 객체를 소유하거나 그 객체의 메서드를 사용합니다.

has - a

  • 조합은 A는 B를 가지고 있다(A has B)의 관계를 나타내며, 클래스는 다른 클래스의 인스턴스를 소유합니다.

장점 키워드

  • 낮은 결합도, 재사용성, 확장성, 높은 유연성

단점 키워드

  • 복잡성 증가, 일관성 감소, 객체의 수 증가

정리

캡슐화를 깨뜨리고 상위 클래스에 의존하게 되어 객체의 변화에 유연하지 못한 상속을 사용하기 보다 조합을 사용하는 것이 좋습니다. 하지만 무조건 조합이 좋은 것은 아니며, 상속을 적절하게 사용한다면 유지보수성이 증대될 수 있습니다.

상속이 좋은 경우

  • 확장과 설계를 고려한 is - a 관계
  • 예를 들어서 ~은 ~이다, “홍길동은 사람이다”와 같은 관계에서는 상속의 이점이 극대화 됩니다.
  • 그 이유는 변할 가능성이 없는 관계이기 때문이며, 일관성이 적절하게 유지되는 관계라고 볼 수 있습니다.

참고

https://developer-nyong.tistory.com/31