🤓 스터디/이펙티브 자바

[아이템 21] 인터페이스는 구현하는 쪽을 생각해 설계하라

강켄트 2023. 3. 31. 12:35

 

자바 8 전에는 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드를 추가할 방법이 없었다.

기존 인터페이스에 메서드를 추가했을 때, 기존 구현체에 이미 존재할 가능성이 아주 낮기 때문에

정의되지 않은 추가 된 메서드로 인해 컴파일 오류가 발생한다.

 

자바 8에 와서 기존 인터페이스에 메서드를 추가할 수 있도록 디폴트 메서드가 나왔다.

 

디폴트 메서드에 대해 정리가 잘 되어있는 것 같아서 첨부해본다.

https://siyoon210.tistory.com/95

 

그러나 모든 기존 구현체들과 매끄럽게 연동되리라는 보장은 없고,

생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기는 어렵다. 

 

Collection 인터페이스에 추가된 removeIf 메서드

위 코드를 보면 Predicate가 true를 반환하는 모든 원소를 제거한다.

코드를 이보다 더 범용적으로 구현하기도 어렵겠지만,

그렇다고 해서 현존하는 모든 Collection 구현체와 잘 어우어지는 것은 아니다.

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;
}

 

디폴트 메서드는 컴파일에 성공하더라도 기존 구현체에 런타임 오류를 일으킬 수 있다.

그러므로 인터페이스를 설계할 때는 여전히 세심한 주의를 기울여야 한다.

 

ps

자바8부터 도입된 인터페이스의 디폴트 메서드를 통해 새로운 메서드를 추가하더라도

기존에 모든 구현체들과 매끄럽게 연동되지 않을 수 있기 때문에 

인터페이스 설계 시 주의가 필요하겠다.