티스토리 뷰

자바는 왜 다중상속을 지원하지 않는지 알아보겠습니다.

 

 

 

 

1. 자바는 왜 다중상속을 지원하지 않을까?


다이아몬드 문제 

다중 상속을 지원하게 되면 하나의 클래스가 여러 상위 클래스를 상속받을 수 있다. 이런 특징 때문에 발생하게 되는 문제가 '다이아몬드 문제'이다.

 


위의 클래스 다이어그램과 같은 상속 구조에서 발생되는 문제가 다이아몬드 문제이다. 예를 들어 GrandFather이라는 클래스가 myMethod()라는 이름의 메서드를 가지고 있다고 가정해 보자. 그리고 FatherA와 FatherB가 각각 오버라이딩하여 구현하였다면, FatherA와 FatherB를 모두 상속받은 Son 클래스 입장에서는 어떤 부모의 myMethod()를 사용해야 할까? 이런 문제로 인하여 충돌이 발생하게 된다.

 

코드로 나타내면 아래와 같다.

class GrandFather {
    void myMethod(){
        System.out.println("GrandFather");
    }
}

class FatherA extends GrandFather {
    @Override
    void myMethod(){
        System.out.println("FatherA");
    }
}

class FatherB extends GrandFather {
    @Override
    void myMethod(){
        System.out.println("FatherB");
    }
}

class Son extends FatherA, FatherB{
    @Override
    void myMethod() {
        super.myMethod(); //FatherA를 출력해야 할까? FatherB를 출력해야 할까?
    }
}

Son클래스 입장에서는 같은 이름의 myMethod가 두개의 상위 클래스에 모두 정의되어 있어, 어떤 메소드를 실행해야 될지 알 수가 없다. 

같은 객체지향 언어인 C++에서는 이런 문제가 있음에도 불구하고 개발자에게 일임하고, 자바는 내부적으로 구현이 불가하도록 막아두었다. (C나 C++은 좀 더 자유로운 반면에 JAVA는 개발 편의성을 생각하는 언어라는 사실을 알 수 있다.)

 

 

자바 인터페이스는 다중상속 되던데?

한가지 의아한 점이 생길 수 있는데, 이런 문제가 있음에도 불구하고 자바 인터페이스는 다중상속이 가능하기 때문이다. 

interface GrandFather {
    void myMethod();
}

interface FatherA extends GrandFather {
    @Override
    void myMethod();
}

interface FatherB extends GrandFather {
    @Override
    void myMethod();
}

interface Son extends FatherA, FatherB{
    @Override
    void myMethod();//상위 인터페이스에서 구현된 것이 없기 때문에 충돌이 발생하지 않는다.
}

인터페이스는 실질적인 구현이 이루어지지 않고 메소드에 대한 선언만 하고 있기 때문에 위처럼 메소드가 겹치더라도 최종 구현 부분은 구현 객체에서 이루어질 것이기 때문에 interface는 다중 상속이 가능하다.

 

 

자바8의 default method는?

자바8 default method는 내부적으로 코드 구현이 가능하다. 따라서, 인터페이스라고 하더라도 마치 class 처럼 다중상속을 받을 수 없게 된다.

interface GrandFather {
    default void myMethod(){
        System.out.println("GrandFather");
    };
}

interface FatherA extends GrandFather {
    @Override
    default void myMethod(){
        System.out.println("FatherA");
    }
}

interface FatherB extends GrandFather {
    @Override
    default void myMethod(){
        System.out.println("FatherB");
    }
}

interface Son extends FatherA, FatherB{
     //컴파일 에러 발생 
}

Class의 다중 상속처럼 컴파일이 진행되지 않지만, myMethod()를 새롭게 오버라이딩 하면 충돌을 해결 할 수 있다.

 

 

 

 

출처

 

자바는 왜 다중상속을 지원하지 않을까? (다이아몬드 문제)

다이아몬드 문제 다중 상속을 지원하게 되면 하나의 클래스가 여러 상위 클래스를 상속 받을 수 있습니다. 이런 특징 때문에 발생하게 되는 문제가 있는데, 바로 '다이아몬드 문제' 입니다. 위의

siyoon210.tistory.com

 

'Java' 카테고리의 다른 글

[Java] 7.패키지  (1) 2022.08.31
[Java] 오버라이딩(Overriding)  (1) 2022.08.24
[Java] 6.상속  (0) 2022.08.24
[Java] 3. 연산자  (0) 2022.08.06
[Java] 2. 자바 데이터 타입, 변수 그리고 배열  (0) 2022.07.26
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함