인터페이스가 수정되면 그를 상속한 클래스들을 전부 수정해야 한다
이를 방지하기 위해 인터페이스 내부에 정적 메서드를 사용하거나, 인터페이스의 기본 구현을 제공할 수 있도록 디폴트 메서드 기능을 사용한다
인터페이스를 구현하는 클래스는 자동으로 인터페이스에 추가된 새로운 메서드의 디폴트 메서드를 상속 받는다
공개된 API를 고치면 기존 버전과의 호환성 문제가 발생
디폴트 메서드를 이용해서 API를 바꾸면 새롭게 바뀐 인터페이스에서 자동으로 기본 구현을 제공해서 기존 코드를 고치지 않아도 된다
public interface Sized {
int size();
default boolean isEmpty() {
return size() == 0;
}
}
위 예시처럼 default로 표기가 되며 Sized 인터페이스를 상속 받으면 isEmpty 메서드를 같이 상속 받게 된다
잘 사용하지 않는 메서드의 기본 구현을 제공할 수 있어서 인터페이스를 구현하는 클래스에서 빈 구현을 제공할 필요가 없어진다
자바에서 클래스는 한 개의 다른 클래스만 상속할 수 있지만 인터페이스는 여러 개 구현할 수 있다.
public Class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable{}
위 예시에서 ArrayList는 한개의 클래스를 상속 받고 여러 인터페이스를 구현한다.
자바8에서는 인터페이스가 구현을 포함할 수 있으므로 클래스는 여러 인터페이스에서 동작을 상속 받을 수 있다.
중복되지 않는 최소한의 인터페이스를 유지한다면 동작을 쉽게 재사용하고 조합할 수 있다.
다른 클래스나 인터페이스로부터 같은 시그니처를 갖는 메서드를 상속 받을 때는 세 가지 규칙을 따라야 한다