[이펙티브 자바] 아이템 20. 추상 클래스보다는 인터페이스를 우선하라
1) 추상 클래스 vs 인터페이스
-자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스, 이렇게 두 가지다.
자바 8부터 인터페이스도 디폴트 메서드(default method)를 제공할 수 있게 되어,
이제는 두 메커니즘 모두 인스턴스 메서드를 구현 형태로 제공할 수 있다.
- 한편, 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는
반드시 추상 클래스의 하위 클래스가 되어야 한다는 점이다.
자바는 단일 상속만 지원하니, 추상 클래스 방식은 새로운 타입을 정의하는데
커다란 제약을 안게 되는 셈이다.
- 반면, 인터페이스가 선언한 메서드를 모두 정의하고
그 일반 규약을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급된다.
2) 인터페이스의 장점
- 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해넣을 수 있다.
인터페이스가 요구하는 메서드를 (아직 없다면) 추가하고,
클래스 선언에 implements 구문만 추가하면 끝이다.
자바 플랫폼에서도 Comparable, Iterable, AutoCloseable 인터페이스가 새로 추가됐을 때,
표준 라이브러리의 수많은 기존 클래스가 이 인터페이스들을 구현한 채 릴리스됐다.
- 반면, 기존 클래스 위에 새로운 추상 클래스를 끼워넣기는 어려운 게 일반적이다.
두 클래스가 같은 추상 클래스를 확장하길 원한다면,
그 추상 클래스는 계층구조상 두 클래스의 공통 조상이어야 한다.
- 안타깝게도 이 방식은 클래스 계층구조에 커다란 혼란을 일으킨다.
새로 추가된 추상 클래스의 모든 자손이 이를 상속하게 되는 것이다.
그렇게 하는 것이 적절하지 않은 상황에서도 강제로 말이다.