java8 번외

갑자기 생각나서 쓴다.
java8 의 추가된 기능 중 interface에 관한 내용이다.
java8 interface는 static 메소드도 구현 가능하다.
이로써 util interface를 구현 할 수 있다는 거다.

또 다른 하나는 default 키워드가 추가 되어 메소드 바디를 갖는 인터페이스가 추가 되었다.
그러면서 다중 상속의 개념이 다시 등장했다.
그래서 한번 테스트를 해봤다.

interface Man {
    default void print(String name) {
        System.out.println("Man :"  + name);
    }
}

interface WoMan {
    default void print(String name) {
        System.out.println("WoMan :"  + name);
    }
}

이런 두개의 인터페이스가 있다고 가정하자.

그리고 두개의 인터페이스를 상속해보자

class Hermaphrodite implements Man,WoMan {
}

그럼 intellij에선 컴파일 에러가 난다.
같은 동일한 메소드가 다 구현 되어 있어서 에러를 내는거 같다.
만약 메소드가 동일 하지 않다면 에러를 내뱉지 않는다.
이로써 다아이몬드 상속은 해결된건가?

다음 코드도 한번 보자.

interface Human{
    default void print(String name) {
        System.out.println("Human "  + name);
    }
}

interface Man extends Human{
    default void print(String name) {
        System.out.println("Man :"  + name);
    }
}

interface WoMan extends Human{
    default void print(String name) {
        System.out.println("WoMan :"  + name);
    }
}

class Hermaphrodite implements Man,WoMan {

    @Override
    public void print(String name) {
        System.out.println("Hermaphrodite : " + name);
    }
}

네개의 클래스와 인터페이스를 만들고 해보자.

public static void main(String[] args) {
    Human man = new Hermaphrodite();
    man.print("wonwoo");
}

실행 결과는 Hermaphrodite : wonwoo
무조건 구현해야 되기 때문에 나올 수 밖에 없다.
그럼 Woman의 default 메소드를 제거하고 Hermaphrodite 구현체를 제거해보자.

interface WoMan extends Human{
}

class Hermaphrodite implements Man,WoMan {
}

다시 실행해보자.

public static void main(String[] args) {
    Human man = new Hermaphrodite();
    man.print("wonwoo");
}

기대했던 결과는

Man wonwoo

일 것이다.
그럼 다음 코드를 보자.

interface Human {
    default void print(String name) {
        System.out.println("Human " + name);
    }
}

interface Man extends Human {
    default void print(String name) {
        System.out.println("Man " + name);
    }
}

interface WoMan extends Human {
    default void print(String name) {
        System.out.println("Man " + name);
    }
}

class Hermaphrodite implements Man, WoMan {
    @Override
    public void print(String name) {
        Man.super.print("wonwoo");
        WoMan.super.print("no!");
    }
}
Human man = new Hermaphrodite();
man.print("wonwoo");
wonwoo
no!

이렇게 하면 다중상속이 된다.