디폴트 메서드의 등장으로 기존 인터페이스에 메서드를 추가할 수 있게 되었음
→ 디폴트 메서드를 추가했을 때, 모든 기존 구현체들과 매끄럽게 연동된다는 보장이 없음
디폴트 메서드가 추가된 예시
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean result = false;
for (Iterator<E> it = iterator(); it.hasNext(); ) {
if (filter.test(it.next())) {
it.remove();
result = true;
}
}
return result;
}
- 자바 8의 Collection 인터페이스에 추가된 removeIf 메서드
- 불리언 함수가 true를 반환하는 모든 원소를 제거
- 범용적이지만 모든 Collection 구현체와 잘 어우러지지는 않음
- 아파치의 SynchronizedCollection은 removeIf를 재정의 하고 있지 않음
- removeIf은 내부적으로 어떠한 동기화 처리도 되어 있지 않음
- removeIf가 default 메서드이기 때문에 SyncronizedCollection 인스턴스에서 호출해서 사용할 수 있는 메서드가 되므로 만약 누군가가 이 사실을 모르고 SyncronizedCollection을 호출한다면 문제가 발생할 수 있음
주의점
- 디폴트 메서드는 컴파일에 성공하더라도 기존 구현체에 런타임 오류를 일으킬 수 있음
- 기존 인터페이스에 디폴트 메서드로 새 메서드를 추가하는 일은 꼭 필요한 경우가 아니라면 피해야 함
- 새로운 인터페이스를 만드는 경우라면 유용한 수단임
- 디폴트 메서드가 생겼기 때문에 기존 인터페이스에 메서드를 추가할 수 있게 되었지만, 인터페이스를 설계할 때 세심한 주의를 기울여야 함