개인 공부 (23.07~

[JAVA] 자바는 다중상속을 지원하지 않는다?

Song쏭 2023. 8. 25. 22:37

자바에서는

① 일반클래스와 추상클래스가

다른 일반 클래스와 추상클래스와의 다중상속이 불가능하다. (단일상속만 가능)

 

② 하나의 인터페이스가

다른 인터페이스들과의 다중상속은 가능하다.

 

그리고 

③ 일반클래스, 추상클래스가

인터페이스를 구현할 때는 다중구현이 가능하다.

( 이때 일반클래스의 경우에는 

단일 구현, 다중 구현일 때 모두 인터페이스에 있는 추상메서드들을 모두 

오버라이드해야한다.

 

추상클래스의 경우에는

필요한 추상메서드들만 오버라이드하여

사용하면 된다. )

 

 

** cf) ②, ③이 가능한 이유는

인터페이스는 구체적인 구현이나 상태(필드)를 포함하지 않기 때문에, 

여러 인터페이스를 상속받거나

여러 인터페이스를 구현하는 것은 문제가 되지 않는다.


키워드로 다시 정리하자면,

 

[ 다중상속 ]

다중상속은 한 클래스가 두 개 이상의 클래스로부터 상속 받는 것을 의미한다. 

자바에서는 직접적인 다중상속을 지원하지 않는다.

단, 인터페이스끼리의 다중상속은 가능하다.

 

[ 다중구현 ]

다중구현은 한 클래스가 두 개 이상의 인터페이스를 구현하는 것을 의미한다.

자바에서는 인터페이스를 통해 다중 구현을 지원한다.


클래스의 다중상속을 허용하지 않는 이유는

'다이아몬드 문제'와 같은 문제가 발생할 수 있기 때문이다.

 

다이아몬드 문제는 

두 개 이상의 슈퍼클래스가 동일한  메서드를 가질 때

하위 클래스에서 이 메서드를 호출하면 

어떤 슈퍼클래스의 메서드를 호출해야 할지 

모호해지는 문제를 말한다.

 

다이아몬드 문제


class A {
    void sayHello() {
        print("Hello from A");
    }
}

class B extends A {
    void sayHello() {
        print("Hello from B");
    }
}

class C extends A {
    void sayHello() {
        print("Hello from C");
    }
}

//다이아몬드 문제 발생
// D 클래스는 B와 C 모두로부터 상속받음
class D extends B, C {  
	void call() {
   	   sayHello(); //B에 있는 것일까? C에 있는 것일까? 자바는 알 수 없다.
    }
}

이렇게 설계된 자바의 특징 덕분에

클래스는 필요한 기능을

다양한 인터페이스로부터 자유롭게 가져와 구현할 수 있게 되었다.