본문 바로가기
ETC/도서

Effective Java 2/E - 규칙.18 추상 클래스 대신 인터페이스를 사용해라

by sorryisme 2022. 12. 4.
  • 추상 클래스가 규정하는 자료형을 구현하기 위해서는 추상 클래스를 반드시 계승해야한다.
  • 인터페이스는 메서드를 정의하고 일반 규약만 지키면 되기에 클래스 계층에 속할 필요가 없다
  • 그렇기에 이미 있는 클래스를 개조해서 새로운 인터페이스를 구현하는 것은 간단하다
    • 필요 메서드를 추가한 다음 implements 절에 넣는 것이 전부다.
  • 인터페이스는 믹스인을 정의하는데 이상적이다
  • 인터페이스는 비 계층적인 자료형 프레임워크를 만들 수 있도록 한다.
public interface Singer {
    AudioClip sing(Song s);
}

public interface SongWriter {
    Song compose(boolean hit);
}

public interface SingerSongwriter extends Singer, Songwriter {
    AudioClip strum();
    void actSensitive();
}
  • 새로운 인터페이스를 확장할 수 있으며 여기에 새로운 메서드를 추가할 수도 있다.
  • 만약 인터페이스를 쓰지 않는다면 조합의 가짓수에 따라 새로운 클래스를 만들어야 한다 (2^n)
  • 이 문제를 조합 폭증이라고 한다
  • 인터페이스를 사용하면 포장 클래스 숙어를 통해 안전하면서 강력한 기능 개선이 가능하다( 규칙 18번 참고)

추상 골격 구현 클래스

  • 인터페이스의 장점과 추상 클래스의 장점을 결합할 수 있다.
    • 인터페이스로 자료형을 정의, 구현은 골격 구현 클래스에 맡기면 된다.
    • 관습적으로 골격 구현 클래스의 이름은 AbstractInterface와 같이 정한다
static List<Integer> intArrayAsList(final int[] a) {
    if (a == null) throw new NullPointException();
    return new AbstractList<Integer>() {
        ...    
    }

}
  • 인터페이스를 살펴보고 다른 메서드를 쓸 때 기본 메서드들을 추려낸다
    • 기본 메서드들은 추상메서드로 선언하고 나머지 메서드들은 구현해서 넣는다
  • 인터페이스보다 추상 클래스가 발전하기 쉽다.
  • 인터페이스가 공개되고 널리 구현된 다음에는 인터페이스 수정이 거의 불가능하다