카테고리 없음

JAVA8에 대해 알아보자(번외)

머룽 2023. 4. 18. 12:31

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!
이렇게 하면 다중상속이 된다.