전통적인 Java에서 인터페이스와 관련 메소드는 한 몸처럼 구성된다.
인터페이스를 구현하는 클래스는 인터페이스에서 정의하는 모든 메서드 구현을 제공하거나 아니면 슈퍼클래스의 구현을 상속받아야 한다.
평소에는 이 규칙을 지키는 데 아무 문제가 없지만 라이브러리 설계자 입장에서 인터페이스에 새로운 메서드를 추가하는 등 인터페이스를 바꾸고 싶을 때는 문제가 발생한다!
Java 8에서는 기본 구현을 포함하는 인터페이스를 정의하는 두 가지 방법을 제공한다.
Java 8에서는 List 인터페이스에 sort
메서드가 추가되었다.
default void sort(Comparator<? super E> c) {
Collections.sort(this, c);
}
→ 사전에 작성한 인터페이스에 디폴트 메서드로 추가함으로써, 이를 구현하는 클래스들은 자동으로 새로운 디폴트 메서드를 상속받게 된다!
<aside> 💡 라이브러리 설계자라면 기존 구현을 고치지 않고도 인터페이스를 바꿀 수 있으므로 디폴트 메서드를 잘 이해하는 것이 중요하다. 디폴트 메서드는 다중 상속 동작이라는 유연성을 제공하면서 프로그램 구성에도 도움을 준다.
</aside>