Java 8은 인터페이스에 새로운 메소드를 추가할 수 있는 방법을 제시했다.
만약 Java 8 이전 버전에서 인터페이스에 새로운 메소드를 추가한다고 가정해보자.
자주 사용되는 Collection
의 경우,
Java 8 버전에는 Stream
이 추가되었고 Collection
의 stream()
을 통하여 Collection -> Stream 으로 변환할 수 있다는 것을 우리는 알고 있다.
그렇다면 Collection
인터페이스에서는 새로운 메소드인 stream()
이 추가되었기 때문에 해당 인터페이스를 구현하는 모든 구현체들은 메소드를 구현해야 할까?
기존의 구현을 갈아엎는(?) 일을 방지하기 위하여 Java 8은 default method를 도입했다.
default method는 추상과 구현의 개념이 아닌, 인터페이스 자체에서 구현하는 것이다.
따라서 구현체들은 이미 구현된 메소드를 필수적으로 오버라이드할 필요없다.
하지만 하나의 클래스는 여러 인터페이스를 구현할 수 있기 때문에 만약 여러 인터페이스에서 동일한(메소드명, 파라미터 일치) default method를 가진다면 어떻게 될까?
이 문제를 다이아몬드 문제라 하고 다음에서 살펴보자.
Java 8에서는 다이아몬드 문제를 해결하기 위해 3가지 규칙을 따른다.
규칙은 다음과 같고, 우선순위 내림차순이다.
클래스나 슈퍼클래스에서 정의한 메소드가 default method보다 우선권을 가진다.
그 다음 우선순위는 다음과 같은 예시로 설명 가능하다.
A 인터페이스가 B를 상속한다. A 인터페이스는 C를 상속한다. B 인터페이스는 B를 상속한다.
위와 같은 상황에서 B가 default method를 재정의했다면, 서브 인터페이스가 우선된다.
마지막은 명시적 호출인데, 위 두가지 경우가 아니라면 명시적으로 override 해야한다.
C가 A, B를 상속 받는데 default 메소드가 일치하는 경우에는 우선순위를 결정할 수 없기 때문이다.