디폴트 메서드의 등장
자바 8에서 디폴트 메서드의 등장으로 기존 인터페이스에 메서드를 추가할 수 있게 되었다. 하지만 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 쉽지 않다.
예를 들어 Collection 인터페이스에 추가된 removeIf 메서드가 있다. 이 메서드는 if문의 조건이 true를 리턴하면 element를 제거하는 로직을 가지고 있다. 이 디폴트 메서드는 apache.commons.collections4.collection.SynchronizedCollection의 역할을 제대로 못하게 만든다.
=> 아파치 패키지는 객체에 락을 거는 기능을 추가적으로 제공하는데 Collection의 디폴트 메서드 추가로 이러한 약속이 쉽게 깨질 수 있게 되었다.
이런 문제를 막기 위해서 자바 플랫폼 라이브러리에서는 구혀한 인터페이스의 디폴트 메서드를 재정의하고, 다른 메서드에서는 디폴트 메서드를 호출하기 전에 필요한 작업을 수행하도록 만들었지만, 외부 API는 이러한 작업을 모두 강제할 수 없기에 문제가 있을 수 있다.
주의
- 기존 인터페이스에 디폴트 메서드로 새 메서드를 추가하는 일은 꼭 필요한 경우가 아니면 피해야 하며, 새로운 인터페이스를 만드는 편이 더 좋다.
- 디폴트 메서드는 인터페이스로부터 메서드를 제거하거나 기존 메서드의 시그니처를 수정하는 용도가 아니다. 이런 형태로 사용하면 기존 클라이언트를 망가뜨리게 된다.