더북(TheBook)

기본 메서드의 주요 용도는 인터페이스를 진화(interface evolution)시키는 것이다. 오랜 세월 자바 일부로 존재해 온 Collection 인터페이스를 예로 살펴보자. 자바 8 이전에는 다음 클래스를 작성했다고 하자.

public class Bag implements Collection


이후 자바 8에서 Collection 인터페이스에 stream 메서드를 추가했다. 이 stream 메서드는 기본 메서드가 아니라고 가정하자. 그러면 Bag 클래스는 새로 추가된 메서드를 구현하지 않으므로 컴파일되지 않는다. 인터페이스에 기본 메서드가 아닌 메서드를 추가하면 소스 수준에서 호환(source-compatible)되지 않는다.

그런데 클래스를 다시 컴파일하지 않고 Bag 클래스가 포함된 기존 JAR 파일을 그대로 사용한다고 하자. 빠진 메서드가 있는데도 여전히 클래스를 제대로 로드한다. 프로그램에서 여전히 Bag 인스턴스를 생성할 수 있고 문제도 전혀 없다(인터페이스에 메서드를 추가하는 것은 바이너리 수준에서 호환(binary-compatible)된다). 하지만 프로그램에서 Bag 인스턴스로 stream 메서드를 호출하면 AbstractMethodError가 일어난다.

메서드를 default로 선언하면 이 문제를 해결할 수 있다. 즉, Bag 클래스가 제대로 컴파일된다. 또 Bag 클래스를 다시 컴파일하지 않고 로드한 후 Bag 인스턴스로 stream 메서드를 호출하면 Collection.stream 메서드가 호출된다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.