자바7 버젼까지 다중 상속의 개념 보다는 확장이라는 개념이 지배적이었다.

인터페이스를 다중으로 상속받아 좀더 확장된 인터페이스가 되기 때문이다.


그런데 자바8에서는 default method를 이용한 다중상속이 가능하다. 



다음은 그 예제를 구현간단하게 구현 하여 보았다.

비행카(PlaneCar) 라는 다중상속을 받은 인터페이스가 있고, 비행기(Plane)와 자동차(Car)라는 인터페이스가 있다 각 인터페이스는 다음과 같은 기능을 가진다.



[비행카 클래스도]


비행카 인터페이스 에서는 다중상속에는 다이아몬드 문제라는 것이 있다, 그것을 어떻게 처리하는지를 보여주기 위해 carry()라는 default method를 추가 하였다.


public interface Plane{
    default void fly(){
        System.out.println("I can fly.");
    }
    default void carry(){
        System.out.println("plane carry");
    }
}

[PLANE INTERFACE]


public interface Car {
    default void drive(){
        System.out.println("I can drive.");
    }
    default void carry(){
        System.out.println("car carry");
    }
}

[CAR INTERFACE]


public interface PlaneCar extends Plane, Car{
    @Override default void carry(){
        Plane.super.carry();
        Car.super.carry();
    }
}

[PLANECAR INTERFACE]

carry() method의 다이아몬드 문제를 위해 @Override를 통해 처리를 하였다. IDE 툴에서 해당 method를 override 하지 않을 경우 오류가 발생한다.

public class Call implements PlaneCar{
    public static void main(String[] arags){
        new Call().call();
    }
    public void call(){
        fly();
        drive();
        carry();
    }
}

[CALL CLASS]


앞으로 설계를 할때 다중 상속이 필요할 경우 위와 같이 처리 할 수 있을 것이다.

다만, java 개발을 하면서 다중 상속에 대한 생각 없이 설계를 했었는데, 고민할 부분이 추가 된거 같기도하다.

뭐.. 그냥 안써도 되겠지만...


참고 자료 : 

http://m.egloos.zum.com/gyumee/v/3200829

http://www.slideshare.net/mobile/gyumee/8-37599530

Posted by lahuman

댓글을 달아 주세요