ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 다중 상속(multiple inheritance) 이란?
    Language/Java 2020. 1. 2. 04:11
    728x90
    반응형

    예전에 자바 공부를 할 때는 다중상속 이라는게 잘 이해가 되지 않아 살짝 두려운 내용이었지만, 지금 자바 공부를 다시 하고 있을 때는 이해가 되어서 글로 정리를 해보려 한다. ( 예전엔 이게 왜 어려웠었지? )

     

    다중상속이 무엇인지 공부를 하기 전에 하나 알아두어야 할 것은 자바의 일반 클래스는 부모 클래스를 단 하나만 가져야 하므로 여러 부모 클래스를 갖는 다중 상속을 지원하지 않는다. 그러나 인터페이스는 추상 클래스보다 더 추상적이므로 여러 인터페이스를 상속받는 다중 상속을 지원한다. 

     

    그리고 인터페이스는 클래스가 아니다. 그래서 인터페이스를 구현 하는 클래스는 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() 메소드를 사용하려 한다면 아까 일반 클래스에서 다중 상속이 안되는 이유처럼 컴파일 에러가 발생한다.

     

    이를 해결하려면 default A() 메소드를 오버라이딩 해서 사용해야 한다. 

    반응형

    댓글

Designed by Tistory.