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

신명철·2022년 2월 18일
0

Effective Java

목록 보기
19/80

JAVA 8의 Collection 인터페이스에 추가된 removeIf 메소드는 true 를 반환하는 모든 원소를 제거한다.

default boolean removeIf(Predicate<? super E> filter) {
	Objects.requireNonNull(filter);
	boolean removed = false;
	final Iterator<E> each = iterator();
	while (each.hasNext()) {
		if (filter.test(each.next())) {
			each.remove();
			removed = true;
		}
	}
	return removed;
}

디폴트 메서드는 기존 구현체에 런타입 오류를 일으킬 수 있다. 그렇기 때문에 기존의 인터페이스에 디폴트 메서드를 추가하는 일은 꼭 필요한 경우가 아니라면 피해야한다.
추가를 해야한다면 충분한 검토가 필요하다. 반면, 새로운 인터페이스를 만드는 일이라면 표준적인 메서드 구현을 제공하는데 아주 유용한 수단이고 그 인터페이스를 더 쉽게 구현해 활용할 수 있게끔 도와준다.

디폴트 메서드는 인터페이스로부터 메서드를 제거하거나 기존 메서드의 시그니처를 수정하는 용도가 아니다. 이런 형태로 사용하면 기존 클라이언트를 망가뜨리게 된다.

즉, 디폴트 메서드가 있더라고 인터페이스를 설계할 때는 여전히 세심한 주의를 기울여야 한다.

profile
내 머릿속 지우개

0개의 댓글