상태(state), 상속(inheritance), 합성(composition) 의 상관관계
들어가며
F-Lab 멘토링 중 멘토님께서 관련된 질문을 주셨는데 관련하여 깔끔하게 정리해두면 좋을 것 같아서 이 포스팅을 작성한다. 상속과 합성은 어떤 차이가 있는 것인지, 그리고 이 두 개념이 상태라는 개념과는 어떻게 연결되는 것인지 정리해보자.
상속과 합성의 차이
딱 한 문장으로 가장 큰 차이를 정리하자면 위와 같다. 탈것을 상속한 자동차가 상속관계이며 자동차 내에 있는 엔진이나 바퀴 등이 합성 관계이다.
그래서 결국 상속과 합성의 핵심적인 차이는 무엇일까. 한 단어로 말해보자.
'결합도'의 정도의 차이라고 생각한다. 상속은 강한 결합이 발생한다. 부모가 바뀌면 자식에게 많은 영향이 간다. 한편 합성의 관계에서는 상속에 비해서 결합도가 느슨하다고 할 수 있다.
조금 더 자세히 정리해보자. 상속이 합성보다 결합도가 강하다고 말할 수 있는 이유는 아무리 서브클래스에서 재정의를 하더라도 슈퍼클래스에서 해당 메소드의 시그니처를 바꾸면 모든 서브클래스가 영향을 받게 된다. 또한, 슈퍼 클래스의 자원을 서브 클래스가 사용하고 있는데 슈퍼 클래스에서 그 자원의 무엇인가를 바꿔버리면 이를 사용하고 있는 모든 서브 클래스가 영향을 받게 된다.
그러면 이 관점에서 합성을 살펴보자. 사실상 합성은 특정 객체가 다른 객체를 구성으로서 단지 '가지고'(has-a) 있기 때문에 해당 객체에 협력을 요청하는 메세지(인터페이스)만 신경쓴다면 내부적으로 해당 객체가 어떻게 바뀌든 크게 상관이 없다. 즉, 객체의 자율성이 잘 보장되어 있다면 합성된 객체(피소유)의 변경은 '가지고'있는 객체(소유)에 아무 영향을 끼치지 못하며 반대로 '가지는' 객체(소유)의 변경도 반대편(피소유)에 영향을 줄 수 없다.
상태란? (feat. 상속, 합성)
합성된 것도 상태에 포함 시킬 수 있을까? 그렇다고 할 수 있다. 구체적인 예를 들어보자. 자동차가 엔진, 바퀴를 가지고 있다. 그리고 자동차는 탈 것을 상속해서 탈 것이 가진 '운전석'도 프로퍼티로 가지게 된다. 모든게 상태라고 할 수 있을까? 그렇다고 해야하는 것 같다.
다만, 상태를 단순히 '상태=프로퍼티' 로 인식하는 것은 너무 협의의 관점에서 상태를 인식하는 것 같다. 상태가 해당 객체의 속성이나 특성을 의미하긴 하지만 내부를 들여다보면 속성이나 특성이 결국 해당 객체와 합성관계가 존재할 수 있고 상속관계가 존재할 수 있고 일반적인 데이터(자동차로 치면 연식 같은)가 있을 수 있다.
상태를 추상적인 의미에서 '해당 시점의 스냅샷'이라고 이해하고, 더 들여다보면 위와 같은 내용으로 정리될 수 있다고 이해하자. ('객체 지향의 사실과 오해' 에서 상태에 관해 더 자세히 정리되어 있다)
Last updated