티스토리 뷰
인터페이스의 장점
- 자바 8부터 인터페이스도 디폴트 메서드를 제공할 수 있다
- 기존 클래스도 손쉽게 새로운 인터페이스를 구현해 넣을 수 있다
- 인터페이스는 믹스인(mixin) 정의에 안성맞춤이다
- ex) Comparable, AutoCloseable, ...
- 계층 구조가 없는 타입 프레임워크를 만들 수 있다
- ex) Singer, SongWriter 인터페이스를 상속받은 SingerSongWriter 인터페이스
- 래퍼 클래스와 함께 사용하면 인터페이스는 기능을 향상시키는 안전하고 강력한 수단이 된다 (아이템 18)
- 구현이 명백한 것은 인터페이스의 디폴트 메서드를 사용해 프로그래머의 일감을 덜어 줄 수 있다
인터페이스와 추상 골격(skeleton) 클래스
- 인터페이스와 추상 클래스의 장점을 모두 취할 수 있다
- 인터페이스 : 디폴트 메서드 구현
- 추상 골격 클래스 : 나머지 메서드 구현
- 템플릿 메서드 패턴
- AbstractCollection, AbstractList, AbstractMap, ...
- 다중 상속을 시뮬레이트 할 수 있다
public class MyCat extends AbstractCat implements Flyable {
private MyFlyable myFlyable = new MyFlyable();
@Override
protected String sound() {
return "인싸 고양이 두 마리가 나가신다!";
}
@Override
protected String name() {
return "유미";
}
public static void main(String[] args) {
MyCat myCat = new MyCat();
System.out.println(myCat.sound());
System.out.println(myCat.name());
myCat.fly();
}
@Override
public void fly() {
this.myFlyable.fly();
}
private static class MyFlyable extends AbstractFlyable { }
}
- 골격 구현은 상속용 클래스이기 때문에 아이템 19를 따라야 한다
- 문서화(아이템 19 @implSpec 태그) 필요
템플릿 메서드 패턴
- 추상 클래스는 템플릿을 제공하고 하위 클래스는 구체적인 알고리즘을 제공한다
- 템플릿 콜백 패턴 : 상속을 사용하지 않고 확장 가능한 클래스로 만들 수 있음
디폴트 메서드로 Object 메서드를 재정의 할 수 없는 이유
- 디폴트 메서드 핵심 목적은 "인터페이스의 진화"
- 두 가지 규칙만 유지한다
- “클래스가 인터페이스를 이긴다”
- “더 구체적인 인터페이스가 이긴다”
- 토이 예제에나 어울리는 기능이다. 실용적이지 않다.
- 불안정하다.

