Effective Java - Item 21

Updated:

Effective Java

Item 21. 인터페이스는 구현하는 쪽을 생각해 설계하라

디폴트 메서드의 제약

자바 8 이전에는 기존 인터페이스에 메서드를 추가하면 그것을 구현한 모든 클래스가 컴파일 오류가 나, 기존 구현체를 깨트리지 않고서는 메서드를 추가할 방법이 없었다.

자바 8 이후에 default 메서드가 등장하여 메서드를 추가할 수 있었지만, 위험이 사라진것은 아니다.
default 메서드를 선언하면, 그 인터페이스를 구현한 후 default 메서드를 재정의하지 않은 모든 크래스에서 디폴트 구현이 쓰이게 된다. 이는 기존 구현체들과 매끄럽게 연동되리라는 보장은 없다.

불변식을 해치지 않는 디폴트 메서드를 작성하기란 어려운 법이다.

꼭 필요한 경우가 아니면 기존 interface에 default 메서드를 추가하는 것은 피하자

default 메서드는 새로운 인터페이스를 만드는 경우에는 아주 유용한 수단이며, 그 인터페이스를 더 쉽게 구현해 활용할 수 있게끔 해준다.

다만, 기존 구현체에 디폴트 메서드를 사용하는 것은 런타임 오류를 일으킬 수 있다.
또한, 디폴트 메서드는 기존 메서드를 제거하거나 시그니처를 수정하는 용도가 아니다.

결론

디폴트 메서드라는 도구가 생겼더라도 인터페이스를 설계 할때는 이후 구현될 클래스들을 고려하여 세힘한 주의를 기울여야한다.
이를 검증하기 위해서는 서로 다른 방식의 최소 3 가지의 구현체를 만들어 보아 테스트한다.

인터페스를 릴리즈한 후라도 결함을 수정하는게 가능한 경우도 있겠지만, 절대 그 가능성에 기대해서는 안된다.

출처

Joshua Bloch. Effective Java 3/E. n.p.: 인사이트, 2018년 11월 1일.

Reference

https://javabom.tistory.com/44