다중 상속

June·2022년 3월 3일
0

우테코

목록 보기
18/84
post-thumbnail

스터디를 하다가 다중상속 이야기가 나왔다. 자바의 클래스에서 다중상속은 허용되어 있지 않고, 파이썬과 C++에서는 허용되어있다. 하지만 자바에서도 인터페이스에서는 다중상속이 허용되어있다.

다중상속이 무엇이고, 왜 어디서는 허용되고 어디서는 허용되지 않는 것일까

다중상속

다중상속은 말 그대로 여러개의 조상 클래스를 상속하는 것이다.

자바

자바의 클래스에서는 다중 상속을 금지하고 있다.

다이아몬드 문제

그래프의 모양이 다이아몬드를 닮았다고 해서 다이아몬드 문제라고 한다.

이런 경우 ToasterNuclearBomb 모두를 상속한 IDontKnow 클래스가 있다고 생각해보자. 만약 IDontKnow 클래스에서 on() 메서드를 실행시키면 무엇을 호출해야할까?

그래서 애초에 이런 고민을 피하기 위해서 자바에서는 막아놨다.

인터페이스에서는?

하지만 인터페이스에서는 다중상속을 허용해놨다. 그 이유는 인터페이스는 기능에 대한 선언만 해두기에, 다이아몬드 상속이 되더라도 충돌할 여지가 없다. 그러므로 인터페이스에 경우는 다중상속을 통한 문제가 발생하지 않는다.

아닌데요? 자바8부터 디폴트 메서드로 구현체 가질 수 있는데요?

그래서 디폴트 메서드가 조상 인터페이스에 있으면 다중 상속이 불가능하다.

단 위와 같이 override를 해주면 다중상속이 가능해진다.

자바에서는 다중상속이 필요한 경우 이런식으로 해결을 할 수도 있다. (자바의 정석에서는 다중상속 자체를 지양하라고 하고 있다).

또는 불가피한 상황이라면 중요한 것을 상속하고 덜 중요한 것은 클래스 내부에 멤버로 포함시킬 수도 있다 (합성).

다른 언어

C++에서는 에서는 virtual keyword란걸 이용해서 이 문제를 해결한다고 한다.
파이썬에서는 우선 순위를 정해놔서 그것에 따른 결과를 행한다.

왜 이런 차이가?

Why does Python support multiple inheritance if this is considered a bad practice and most languages, including Java, don't?

각 언어가 지향하는 바가 달라서 이런 차이가 발생했다. 파이썬은 간단하고 빠르게 개발하는 것이 목표이고, 자바는 더 엄격한 언어이다. 이러한 차이 덕분에 자바가 좀 더 큰 엔터프라이즈 프로젝트에 사용되고 파이썬은 프로토타입 혹은 스크립트용으로 사용된다고 한다.

0개의 댓글