[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;
    }

    ...
  }
}

정리

  • 복잡한 인터페이스라면 골격 구현을 함께 제공하는 방법을 고려
  • 골격 구현은 ‘가능한 한’ 디폴트 메서드로 제공
    • 골격 구현을 추상 클래스로 제공하는 경우가 더 흔함