다중 상속이란?
다중 상속은 객체 지향 프로그래밍에서 한 클래스가 둘 이상의 클래스로부터 상속을 받을 수 있는 기능으로 이러한 다중 상속은 딱봐도 유리해보이지만 동시에 다이아몬드 문제라는 주요한 문제점을 발생시킬 수 있다
다이아몬드 문제란?
여기서 다이아몬드 문제란 아래 설명을 보면 이해하기 쉬운데
1
2
3
4
5
A
/ \
B C
\ /
D
두 개의 클래스 B와 C가 A 클래스를 상속받고 D 클래스가 B와 C를 동시에 상속받는 구조에서 A 클래스에 정의된 메서드나 변수에 접근하려고 할 때 B와 C 중 어느 경로를 통해 접근해야 하는지 모호하다는 문제이다
예를 들어 A 클래스에 walk() 메서드가 정의되어 있고 B와 C 클래스는 이를 오버라이드하지 않았다고 가정했을 때 D 클래스의 객체에서 walk()를 호출하면 B를 통해 호출해야 할지 C를 통해 호출해야 할지 결정할 수 없게 된다
해결 방법
이 문제를 해결하기 위해 언어들은 자체적인 방법을 각각 가지고 있는데
명시적 경로 지정: 프로그래머가 D 클래스에서 A 클래스의 메서드나 변수에 접근할 때 사용할 경로를 명시적으로 지정하는 방법
상속 순서: 클래스를 상속받는 순서에 따라 접근 경로를 결정하는 방법
다중 상속 금지: 다중 상속을 아예 허용하지 않고 인터페이스를 사용하여 비슷한 기능을 제공하는 방법
가상 상속: 하위 클래스에서 단 한 번만 기반 클래스의 인스턴스를 포함하게 하여 기반 클래스의 인스턴스가 중복으로 포함되는 것을 방지하는 방법
위와 같은 방법으로 언어들에서는 다이아몬드 문제를 방지하고 있다