북스터디와 인턴십 간 컴포지션(조합)을 적용하면서, 상속과 컴포지션의 차이를 확실히 정리해보고자 한다.
참고로, 상속과 컴포지션은 class와 Object간의 관계를 설정하는데 사용되는 기법이다.
기본적으로 상속은 객체지향 프로그래밍 4대 원칙(추상화, 상속, 다형성, 캡슐화) 중 하나이다.
extends
키워드를 사용하며, 자식 클래스는 부모 클래스 상속하여 아래와 같은 이점 등을 얻을 수 있다.
코드를 재사용성 및 확장성 증가
클래스 상속을 통해 부모 클래스의 자원을 자식 클래스가 그대로 물려받게 되며, 부모 클래스 자원은 그대로 재 사용하고 자식 클래스 자원만 정의하면 된다.
또, 새로운 클래스가 필요할 때 상속을 통해 기본 구조를 쉽게 확장할 수 있다.
개발 시간 단축
공통적인 속성을 묶은 클래스(부모)는 이미 구현되어 있기 때문에, 구체적인 클래스(자식)의 속성과 행위만 구현하면 된다.
하지만, 상속을 활용하면 자식 클래스는 부모 클래스의 내부 구현에 대해 상세히 알아야하기 때문에 강한 결합이 발생한다.
또한, 상속 관계는 컴파일 시점에 결정되며, 여러 조합의 사용이 필요한 경우 상속을 사용하면, 조합 별로 클래스를 모두 추가해야 된다. 흔히 클래스 폭발이라 한다.
런타임 의존성은 컴파일 시점 어느 구체 클래스에 의존하는지 몰라도 되는 반면, 컴파일 타임 의존성은 구체 클래스에 강한 의존성이 생겨 변경에 유연하게 대처하지 못한다.
(상속 보단 인터페이스를 지향 하라는 근거)
즉, 상속은 클래스 간 관계를 한눈에 파악하고 재 사용성이 증가하는 방법이지만, 잘못 사용하면 시스템 문제가 발생하기 쉽다.
“컴파일 타임 의존성”
”런타임 의존성”