이전 포스트를 다루며, 상속의 단점으로 다중 상속이 되지 않는다는 것을 예로 들었습니다.
도대체 다중 상속은 왜 지원하지 않는 것일까요?
지금부터 두 가지의 문제를 알아봅시다.
dlwoguq0928 님 블로그 사진
만일 위와 같은 상속 구조가 있다고 가정해봅시다.
GrandFather 가 FatherA, FatherB 에게 상속을 해주었습니다.
만일, 상속받은 메서드를 각각 다르게 오버라이딩 해줬다면 어떻게 될까요?
과연 Son 은 어떤 메서드를 물려받게 되는 것일까요??
위와 같은 상속 구조로 이러한 모호함이 생기는 문제를 다이아몬드 문제라고 칭합니다.
Python 으로 다중 상속을 구현했다고 가정해볼게요.
dlwoguq0928 님 블로그 사진
이 경우 Undergraduate 는 Person 의 greeting 을 상속받을까요, University 의 greetting 을 상속 받을까요?
정답은 가장 첫번째 인자의 메서드를 상속받는다고 합니다.
이는 간단히 넘어갈 문제가 아닙니다.
현재로서는 굉장히 간단하게 부모-자식 관계로 이루어져있지만, 만일 이 Depth 가 더 깊어진다면 어떻게 될까요?
우리는 어떠한 메서드가 사용될지, 혹은 사용해야 할지를 알기 위해서 마치 DFS 알고리즘과 같은 탐색 방법을 손수 두뇌로 돌려줘야 할 것입니다.
개인적인 생각으로는, 개발의 시간을 늦추는 굉장히 심각한 문제라고 할 수 있을 것 같아요!
Java 에는 Interface 에 Default Method 를 기능이 추가되어 있어, 상속의 장점을 더욱 더 무력화 시켰습니다.
하지만, 위와 같은 경우 이도 다이아몬드 문제를 유발할 수도 있지 않을까요??
public interface Interface1 {
default void print() {
System.out.println("interface1");
}
}
public interface Interface2 {
default void print() {
System.out.println("interface2");
}
}
public class UseInterface implements Interface1, Interface2 {
@Override
public void print() {
Interface1.super.print();
// 혹은
Interface2.super.print();
}
}
다이아몬드 문제를 위와 같이 어떤 인터페이스의 메서드를 활용할 것인지 명시하여 해결하게끔 하네요!
명시하지 않으면 컴파일 에러가 나게 됩니다.
역시 제임스 고슬링은 짱입니다.
다중 상속말고 다른 방법들이 많습니다.
제가 사용하고 있는 Java 같은 경우는 interface 를 다중으로 상속 받으면 됩니다.
그 이외에도 합성으로 해결할 수도 있는 문제이죠.
다중 상속이 정답은 아니라는 것이고, 오히려 지양하는 경우, 유지보수 하기 좋은 코드가 나온다고 생각합니다.
다중 상속을 지원하지 않는 Java 에게 감사하며, 오늘도 재미있게 코딩합시다!
https://velog.io/@dlwoguq0928/%EB%8B%A4%EC%A4%91-%EC%83%81%EC%86%8D%EC%9D%84-%EC%A7%80%EC%96%91%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0
https://www.tutorialspoint.com/how-to-solve-diamond-problem-using-default-methods-in-java