기본 메소드 default method
- 인터페이스에 메소드 선언이 아니라 구현체를 바로 제공하는 방법
- 해당 인터페이스를 구현한 클래스를 깨트리지 않고 새기능을 추가할 수 있다
- 기본 메서드는 구현체가 모르게 추가된 기능으로 그만큼 리스크가 있다
- 런타임에러가 발생할 수 있다
- 반드시 문서화 해야한다 (impleSpec 자바독 태그 사용)
- Object가 제공하는 기능 (equals, toString)은 기본 메서드로 제공할 수 없다
- 본인이 수정할 수 있는 인터페이스에만 기본메서드를 제공할 수 있다
- 인터페이스를 상속받는 인터페이스에서 다시 추상 메서드로 변경할 수 있다
- 상속받은 기본 메소드를 인터페이스 구현체가 재정의 할 수 있다
- 하나의 클래스에서 두개의 인터페이스를 상속받는데 중복된 기본메소드가 있을 경우 필수적으로 재정의를 해야한다
스태틱 메소드 static method
- 해당 타입 관련 헬터 또는 유틸리티 메소드를 제공할 때 인터페이스에 스태틱 메소드를 제공할 수 있다
코드
인터페이스 Foo, Bar
public interface Foo {
void printName();
default void printNameUpperCase(){
System.out.println(getName().toUpperCase());
}
static void printAnything() {
System.out.println("Foo");
}
String getName();
}
public interface Bar {
default void printNameUpperCase(){
System.out.println("BAR");
};
}
구현체
public class DefaultFoo implements Foo, Bar{
String name;
public DefaultFoo(String name) {
this.name = name;
}
@Override
public void printNameUpperCase() {
System.out.println(this.name.toUpperCase());
}
@Override
public void printName() {
System.out.println(this.name);
}
@Override
public String getName() {
return this.name;
}
@Override
public String toString() {
return "my name is "+ this.name;
}
}
Main
Foo foo = new DefaultFoo("woonsik");
foo.printName();
foo.printNameUpperCase();
Foo.printAnything();