스터디를 하다가 다중상속 이야기가 나왔다. 자바의 클래스에서 다중상속은 허용되어 있지 않고, 파이썬과 C++에서는 허용되어있다. 하지만 자바에서도 인터페이스에서는 다중상속이 허용되어있다.
다중상속이 무엇이고, 왜 어디서는 허용되고 어디서는 허용되지 않는 것일까
다중상속은 말 그대로 여러개의 조상 클래스를 상속하는 것이다.
자바의 클래스에서는 다중 상속을 금지하고 있다.
그래프의 모양이 다이아몬드를 닮았다고 해서 다이아몬드 문제라고 한다.
이런 경우 Toaster
와 NuclearBomb
모두를 상속한 IDontKnow
클래스가 있다고 생각해보자. 만약 IDontKnow
클래스에서 on()
메서드를 실행시키면 무엇을 호출해야할까?
그래서 애초에 이런 고민을 피하기 위해서 자바에서는 막아놨다.
하지만 인터페이스에서는 다중상속을 허용해놨다. 그 이유는 인터페이스는 기능에 대한 선언만 해두기에, 다이아몬드 상속이 되더라도 충돌할 여지가 없다. 그러므로 인터페이스에 경우는 다중상속을 통한 문제가 발생하지 않는다.
아닌데요? 자바8부터 디폴트 메서드로 구현체 가질 수 있는데요?
그래서 디폴트 메서드가 조상 인터페이스에 있으면 다중 상속이 불가능하다.
단 위와 같이 override를 해주면 다중상속이 가능해진다.
자바에서는 다중상속이 필요한 경우 이런식으로 해결을 할 수도 있다. (자바의 정석에서는 다중상속 자체를 지양하라고 하고 있다).
또는 불가피한 상황이라면 중요한 것을 상속하고 덜 중요한 것은 클래스 내부에 멤버로 포함시킬 수도 있다 (합성).
C++에서는 에서는 virtual keyword란걸 이용해서 이 문제를 해결한다고 한다.
파이썬에서는 우선 순위를 정해놔서 그것에 따른 결과를 행한다.
각 언어가 지향하는 바가 달라서 이런 차이가 발생했다. 파이썬은 간단하고 빠르게 개발하는 것이 목표이고, 자바는 더 엄격한 언어이다. 이러한 차이 덕분에 자바가 좀 더 큰 엔터프라이즈 프로젝트에 사용되고 파이썬은 프로토타입 혹은 스크립트용으로 사용된다고 한다.