자바 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
댓글을 달아 주세요