객체지향 언어에서 다중 상속에 대한 문제는 꾸준히 제기되어 왔다.
다중 상속을 사용하다 보면 코드의 흐름이 모호해지고, 여러 가지 문제를 일으킬 수 있다.
이러한 이유로 다중 상속 자체를 지원하지 않는 언어도 있다.
또한, 나를 포함한 일부 개발자들은 다중 상속의 사용 자체를 지양해야 한다고 주장한다.
그렇다면 다중 상속은 꼭 필요할까? 필요하다면, 어떤 상황에서 쓰는 게 좋을까?
이처럼 Son이 FatherA와 FaterB의 메서드와 속성을 상속받는 관계가 있다고 가정하자.
그런데 FatherA와 FatherB에 같은 메서드가 존재한다면 어떨까? F
atherA와 FatherB가 GrandFather을 상속받으면서 해당 메서드를 서로 다르게 오버 라이딩했다면?
Son 입장에서 어떤 부모의 메서드를 상속받는지 예측하기 어렵다.
이러한 논리적 모호함이 충돌이나 오류를 야기할 수 있다.
흔히 다이아몬드 문제라고 부른다.
(https://youngjinmo.github.io/2021/03/diamond-problem/)
꼭 다이아몬드 모양이 아니더라도 다중 상속은 혼란을 야기할 가능성이 있다.
파이썬으로 예를 들어서, 다음과 같이 다중 상속을 받은 클래스가 있다고 하자.
이때, Undergraduate에서 super() 메서드가 반환하는 객체는 어떤 부모를 가리킬까?
답은 간단하다. 가장 왼쪽에 있는 부모 클래스인 Person을 가리키도록 정해져 있다.
하지만 이러한 다중 상속이 여러 단계에 걸쳐 깊게 형성되어 있다면 어떨까?
인간의 두뇌로 'DFS(깊이 우선 탐색)'을 하고 있는 자신을 발견할 수 있을 것이다.
물론, 이러한 구조를 대신 파악해 주는 방법들도 제공되고 있다.
(https://wikidocs.net/16073)
하지만, '이런 수고로움을 감수할 정도로 다중 상속이 편리한가?'라는 의문이 여전히 든다.
정말 다중 상속이라는 기능이 편리한 건지, 아니면 단순히 그런 방식에 익숙해져 버린 것인지는 스스로 평가할 필요가 있다.
다중 상속은 편리함을 위해 필요할 뿐, 필수적인 기능이 아니다.
특히, Java에서는 다중 상속이라는 개념이 존재하지 않는다.
(https://siyoon210.tistory.com/125)
다중 상속이 없어서 어떤 기능을 구현하지 못하는 경우는 없다.
조금 불편하더라도 다중 수준 상속으로 얼마든지 나타낼 수 있다.
(https://ko.strephonsays.com/multiple-and-vs-multilevel-inheritance-7250)
그렇다면 '다중 상속의 편리함과 위험성 중에 어느 쪽이 영향이 클까?'
이 질문이 바로 다중 상속의 찬/반 여론을 구분 짓는 쟁점일 것이다.
필자가 다중 상속을 안 좋게 바라보는 가장 큰 이유는 생산성 측면에서이다.
다중 상속으로 단축되는 작업 시간보다, 예기치 못한 오류로 고생하는 시간이 더 크다고 생각한다.
나는 여전히 다중 상속의 사용을 최대한 지양하는 것이 좋다고 생각한다.
그러나 누군가는 다중 상속을 문제없이 잘 쓸 거라고 자신한다.
또, 어떤 개발자는 다중 상속으로 문제를 겪을 부담보다도 그 편리함으로부터 얻는 효용이 크다고 말한다.
그 사람들에게는 다중 상속을 사용하는 것이 정답일 것이다.
그러므로 선택은 개인의 몫, 만약 조직이라면 그 내부에서 합의를 통해 정해진 룰에 따르는 것이 결론일 것이다.