ABOUT ME

-

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

    댓글

Designed by Tistory.