[JAVA] 다중 상속(multiple inheritance) 이란?
예전에 자바 공부를 할 때는 다중상속 이라는게 잘 이해가 되지 않아 살짝 두려운 내용이었지만, 지금 자바 공부를 다시 하고 있을 때는 이해가 되어서 글로 정리를 해보려 한다. ( 예전엔 이게 왜 어려웠었지? )
다중상속이 무엇인지 공부를 하기 전에 하나 알아두어야 할 것은 자바의 일반 클래스는 부모 클래스를 단 하나만 가져야 하므로 여러 부모 클래스를 갖는 다중 상속을 지원하지 않는다. 그러나 인터페이스는 추상 클래스보다 더 추상적이므로 여러 인터페이스를 상속받는 다중 상속을 지원한다.
그리고 인터페이스는 클래스가 아니다. 그래서 인터페이스를 구현 하는 클래스는 implements 를 통해서 구현을 하고 인터페이스 끼리의 상속을 받을 때는 extends 를 사용한다.
예를들어 X, Y 라는 인터페이스가 존재하고 이를 상속받는 MyInterface 도 존재한다고 가정하자. MyInterface를 구현 할 클래스인 MyClass도 존재한다.
1
2
3
|
public interface MyInterface extends X, Y {
}
|
이렇게 인터페이스에서 다중 상속을 할 때는 , 로 구분을 해서 나열한다.
1
2
3
|
public class MyClass extends PMyClass implements MyInterface {
}
|
그리고 MyClass의 부모 클래스인 PMyClass 도 있다고 가정하면 이렇게 일반 클래스 or 추상 클래스로 부터의 상속도 받고 인터페이스도 구현을 하는 클래스로 extends 와 implements를 같이 써서 사용할 수도 있다.
그냥 이렇게 다중 상속의 개념만 놓고보면 진짜 단순하다. ( 그냥 부모가 2개 이상이면 다중 상속이다 )
그렇다면 다중 상속은 자바에서는 왜 지원하지 않는 것일까?
https://siyoon210.tistory.com/125ㅇ
자바는 왜 다중상속을 지원하지 않을까? (다이아몬드 문제)
다이아몬드 문제 다중 상속을 지원하게 되면 하나의 클래스가 여러 상위 클래스를 상속 받을 수 있습니다. 이런 특징 때문에 발생하게 되는 문제가 있는데, 바로 '다이아몬드 문제' 입니다. 위의 클래스 다이어그..
siyoon210.tistory.com
제가 쓰는 글을 공부한 것을 정리하는 TIL 용도입니다. ( 위의 글에서 잘 정리 되어 있어서 참고하려 합니다! )
위와 같은 구조가 있다고 가정해보자. GrandFather 에 A() 라는 메소드가 있어서 FatherA 와 FatherB 에서 오버라이딩 해서 구현 했다고 생각해보자. 이러면 Son 입장에서는 A() 메소드를 호출 했을 때 누구의 메소드를 가져다 써야 할지 정할 수 없다. 따라서 컴파일도 되지 않는다.
인터페이스는 기능에 대한 선언만 하기 때문에, 위와 같은 경우더라도 충돌할 여지가 없다. 생각해보면 인터페이스 안에는 추상메소드만 선언을 하기 때문에 하위 클래스들은 그 추상메소들을 오버라이딩 해서 사용한다. ( 구현을 한다 )
( 위의 그림의 경우를 인터페이스라고 가정한다면 다이아몬드에 보이는 4개 다 interface 이다 )
default method는? (자바 8 이후부터 가능)
나는 default method가 가능하다는 것을 오늘 알았다.. 책에는 이런말이 없었는데 인터페이스를 검색해보다가 알게 되었다. default method는 재정의(오버라이딩)해서 사용할 수 있다.
그리고 default method 는 그러면 하위 클래스에서 구현을 해야할까? 라는 점이 궁금했다.
하지만 이미 디폴트 메소드는 구현이 된 것이기 때문에 다시 구현을 할 필요가 없다는 점을 알게 되었다.
그리고 아까 위의 다이아몬드 관계에서 가장 상위 인터페이스인 GrandFather 이 default A() 메소드를 구현하고, 아래 FatherA 와 FatherB 에서 default A() 메소드를 오버라이딩을 했다면, 가장 하위 클래스인 Son에서 default A() 메소드를 사용하려 한다면 아까 일반 클래스에서 다중 상속이 안되는 이유처럼 컴파일 에러가 발생한다.