자바 8에서 인터페이스 (Interface)에 디폴트 메소드와 정적 메소드가 추가되었다.


다음은 이를 테스트하는 예제 (Example)이다.


import org.junit.Test;


public class DefaultMethodTest {


    static interface InterfaceA {

        String getSomething();


        void useStatic();


        void useDefault();


        static void doSomethingInStatic() {

            System.out.println("Doing something...");

        }


        default void doSomethingInDefault() {

            System.out.println("Doing something with " + getSomething() + "...");

        }

    }


    static class ClassA implements InterfaceA {

        @Override

        public String getSomething() {

            return "something";

        }


        @Override

        public void useStatic() {

//            doSomethingInStatic();

            InterfaceA.doSomethingInStatic();

        }


        @Override

        public void useDefault() {

            doSomethingInDefault();

        }

    }


    @Test

    public void test() {

        ClassA a = new ClassA();

        InterfaceA.doSomethingInStatic();

//        a.doSomethingInStatic();

        a.doSomethingInDefault();


        a.useStatic();


        a.useDefault();

    }


}


정적 메소드는 인터페이스 이름으로만 접근할 수 있다.


인터페이스 타입의 객체를 통해서도 접근할 수 없다.


따라서 정적 메소드는 유틸리티 메소드에 적합하다.


객체 내에서 인터페이스 이름 없이 정의하고자 하는 메소드를 직접 사용하거나,


정의하고자 하는 메소드 내에서 객체를 참조한다면,


디폴트 메소드로 작성해야만 한다.


-----


다음은 디폴트 메소드에 대한 다중 상속 (Multiple Inheritance) 테스트이다.


import org.junit.Test;


public class DefaultMethodMultipleInheritanceTest {


    static interface InterfaceA {

        default void doSomething() {

            System.out.println("InterfaceA");

        }

    }


    static interface InterfaceB {

        default void doSomething() {

            System.out.println("InterfaceB");

        }

    }


//    static class ClassA implements InterfaceA, InterfaceB {

    static class ClassA implements InterfaceA {

        public void test() {

            doSomething();

        }

    }


    @Test

    public void test() {

        ClassA a = new ClassA();

        a.test();

    }


}


혹시나 해서 시도해봤지만, 컴파일 에러가 발생했다.


Reference:

http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

Posted by izeye