Effective Java

[이펙티브 자바] 아이템 20. 추상 클래스보다는 인터페이스를 우선하라

깊게 생각하고 최선을 다하자 2024. 12. 18. 17:09

 

1) 추상 클래스 vs 인터페이스


-자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스, 이렇게 두 가지다.

  자바 8부터 인터페이스도 디폴트 메서드(default method)를 제공할 수 있게 되어,

  이제는 두 메커니즘 모두 인스턴스 메서드를 구현 형태로 제공할 수 있다. 

 

- 한편, 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는

  반드시 추상 클래스의 하위 클래스가 되어야 한다는 점이다.

  자바는 단일 상속만 지원하니, 추상 클래스 방식은 새로운 타입을 정의하는데 

  커다란 제약을 안게 되는 셈이다.

 

- 반면, 인터페이스가 선언한 메서드를 모두 정의하고

  그 일반 규약을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급된다. 

 

2) 인터페이스의 장점

기존 클래스에도 손쉽게 새로운 인터페이스를 구현해넣을 수 있다.

   인터페이스가 요구하는 메서드를 (아직 없다면) 추가하고, 

   클래스 선언에 implements 구문만 추가하면 끝이다.

   자바 플랫폼에서도 Comparable, Iterable, AutoCloseable 인터페이스가 새로 추가됐을 때,

   표준 라이브러리의 수많은 기존 클래스가 이 인터페이스들을 구현한 채 릴리스됐다.

 

- 반면, 기존 클래스 위에 새로운 추상 클래스를 끼워넣기는 어려운 게 일반적이다.

  두 클래스가 같은 추상 클래스를 확장하길 원한다면,

  그 추상 클래스는 계층구조상 두 클래스의 공통 조상이어야 한다.

  

- 안타깝게도 이 방식은 클래스 계층구조에 커다란 혼란을 일으킨다.

  새로 추가된 추상 클래스의 모든 자손이 이를 상속하게 되는 것이다.

  그렇게 하는 것이 적절하지 않은 상황에서도 강제로 말이다.