[Effective Java 3/e] 아이템 20 - 추상 클래스보다는 인터페이스를 우선하라
아이템 20 - 추상 클래스보다는 인터페이스를 우선하라
인터페이스의 장점
- 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해 넣을 수 있다.
- 인터페이스는 믹스인 정의에 안성맞춤이다.
- 원래 ‘주된 타입’ 외에도 특정 선택적 행위를 제공한다고 선언하는 효과
- ex) Comparable
- 인터페이스로는 계층구조가 없는 타입 프레임워크를 만들 수 있다.
- 인터페이스는 기능을 향상시키는 안전하고 강력한 수단이 된다.
Singer와 Songwriter 모두 확장하고 새로운 메서드까지 추가한 제3의 인터페이스 정의
public interface Singer {
AutoClip sing(Song s);
}
public interface Songwriter {
Song compose(int chartPosition);
}
public interface SingerSongwriter extends Singer, Songwriter {
AudioClip strem();
void actSensitive();
}
인터페이스와 추상 골격 구현 클래스 함께 제공
- 인터페이스와 추상 클래스의 장점을 모두 취하는 방법
- 인터페이스로는 타입을 정의, 필요하면 디폴트 메서드도 제공
- 골격 구현 클래스는 나머지 메서드들까지 구현
- ex) AbstractCollection, AbstractSet, AbstractList
골격 구현을 사용해 완성한 구체 클래스
static List<Integer> intArrayAsList(int[] a) {
Objects.requireNonNull(a);
return new AbstractList<>() {
@Override public Integer get(int i) {
return a[i];
}
@Override public Integer set(int i, Integer val) {
int oldVal = a[i];
return oldVal;
}
...
}
}
정리
- 복잡한 인터페이스라면 골격 구현을 함께 제공하는 방법을 고려
- 골격 구현은 ‘가능한 한’ 디폴트 메서드로 제공
- 골격 구현을 추상 클래스로 제공하는 경우가 더 흔함