13장

1. 디폴트 메서드란 무엇인가?

자바 7까지는 인터페이스를 변경하면 인터페이스를 구현한 모든 클래스를 수정해야 했다. 자바 8에서는 기존의 구현을 수정하지 않고 인터페이스를 변경할 수 있도록 디폴트 메서드를 지원한다. 디폴트 메서드를 이용하면 자바 API의 호환성을 유지하면서 라이브러리를 변경할 수 있다.

png

디폴트 메서드(default method)는 인터페이스에서 구현하는 메서드를 말한다. 디폴드 메서드는 default 키워드로 시작하며 다른 클래스에 선언된 메서드처럼 메서드 바디를 포함한다.

2. 디폴트 메서드 활용 패턴

2.1. optional method

디폴트 메서드를 활용하면 기본 구현을 제공할 수 있으므로 인터페이스를 구현하는 클래스에서 빈 구현을 제공할 필요가 없다. 자바 7까지는 remove에 빈 구현을 제공했으나, 자바 8 부터는 Iterator 인터페이스에서 remove 메서드를 정의한다.

interface Iterator<T> {
    boolean hasNext();
    T next();
    default void remove() {
        throw new UnsupportedOperationException();
    }
}

2.2. 동작 다중 상속

인터페이스는 다중 상속이 가능하다. 따라서 디폴트 메서드가 포함된 인터페이스를 활용해서 동작 다중 상속 기능을 구현할 수 있다.

png

3. 상속 규칙

다른 클래스나 인터페이스로부터 같은 시그니처를 갖는 메서드를 상속받을 때는 세 가지 규칙을 따른다.

  1. 클래스가 항상 이긴다: 클래스/슈퍼클래스에서 정의한 메서드가 디폴트 메서드보다 우선권을 갖는다.

  2. 1번 규칙 이외의 상황에서는 서브 인터페이스가 이긴다. 즉 B가 A를 상속받는다면 B가 A를 이긴다.

  3. 여전히 디폴트 메서드의 우선순위가 결정되지 않았다면 여러 인터페이스를 상속받는 클래스가 명시적으로 디폴트 메서드를 오버라이드하고 호출해야 한다.

참고 자료

  • 모던 자바 인 액션 - 한빛미디어

Last updated