0%

디폴트 메서드

디폴트 메서드는 인터페이스내 기본구현된 메서드로 하위호환을 유지하며 API를 바꿀 수 있도록 한다. default 키워드로 시작하며 클래스에 선언된 메서드처럼 메서드 바디를 포함한다.

1
2
3
4
5
6
public interface Sized {
int size();
default boolean isEmpty() { // 디폴트 메서드
return size() == 0;
}
}

추상 클래스 vs 자바8의 인터페이스

  1. 클래스는 하나의 추상 클래스만 상속받을 수 있지만 인터페이스를 여러 개 구현할 수 있다.
  2. 추상 클래스는 인스턴스 변수(필드)로 공통 상태를 가질 수 있다. 하지만 인터페이스는 인스턴스 변수를 가질 수 없다.

해석 규칙

  1. 클래스가 항상 이긴다. 클래스나 슈퍼클래스에서 정의한 메서드가 디폴트 메서드보다 우선권을 갖는다.
  2. 1번 규칙 이외의 상황에서는 서브인터페이스가 이긴다. 상속관계를 갖는 인터페이스에서 같은 시그너처를 갖는 메서드를 정의할 때는 서브인터페이스가 이긴다. 즉, B가 A를 상속받는다면 B가 A를 이긴다.
  3. 여전히 디폴트 메서드의 우선순위가 결정되지 않았다면 여러 인터페이스를 상속받는 클래스가 명시적으로 디폴트 메서드를 오버라이드하고 호출해야한다.

Reference : Java 8 in Action