Effective Java 04 - item 20 -
in Programming Language on Java
추상 클래스 보다는 인터페이스를 우선하라
자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스. 두 가지이다.
자바 8부터는 인터페이스가 디폴트 메서드를 제공하면서 두 메커니즘 모두 인스턴스 메서드를 구현 형태로 제공할 수 있게 되었다.
자바는 단일 상속만 지원하다보니 추상 클래스는 반드시 상속을 해야한다는 점에서 약점이 된다.
인터페이스는 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해줄 수 있다.
인터페이스를 사용하면 계층구조가 없는 타입 프레임워크도 만들 수 있다.
가령 Signer라는 인터페이스와, Songwriter라는 인터페이스가 있으면, 이 두 인터페이스를 상속받는 인터페이스는 싱어송 라이터가 될 것이다.
이처럼 인터페이스를 조합하여 유연한 설계를 가져갈 수 있는 것이 인터페이스의 큰 장점이다.
한편, 인터페이스와 추상 골격 구현 클래스를 함께 제공하는 식으로 인터페이스와 추상 클래스의 장점을 모두 취하는 방법도 존재한다.
인터페이스로 타입을 정의하고, 필요하면 디폴트 메서드도 지원해준다.
이렇게 골격만 잡아두고 확장을 자유롭게 열어둔다. 이것이 디자인패턴 중 하나인 바로 템플릿 메서드 패턴이다.
관례상 인터페이스 이름이 Harry라면, 골격 구현 클래스의 이름은 AbstractHarry
로 짓는 것이 관례라고 한다.
대표적으로 컬렉션 프레임워크의 AbstractCollection
, AbstractList
등이 있다.
Reference
이펙티브 자바 Effective Java 3/E
조슈아 블로크