본문 바로가기

프로그래밍/Book

[모던 자바 인 액션] 13장. 디폴트 메서드

디폴트 메서드란?

하위 호환성을 유지하면서 API를 바꿀 수 있도록 추가된 기능. 디폴트 메서드를 사용하면 바뀐 인터페이스에서 기본 구현을 제공하므로 기존의 코드를 고칠 필요가 없게 해준다.
default라는 키워드로 시작하며 다른 클래스에 선언된 메서드처럼 바디를 포함한다. 따라서 해당 인터페이스를 상속받는 구현체들은 디폴트 메서드의 구현도 상속받게 되어 하위 호환성이 유지되는 것이다.

추상 클래스와 인터페이스의 차이점

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

디폴트 메서드 활용 패턴

선택형 메서드

인터페이스를 구현하는 클래스에서 필요 없는 메서드의 내용이 비어있을 수가 있는데 디폴트 메서드를 이용하면 기본 구현을 제공할 수 있어서 빈 구현을 제공하지 않아도 된다. (불필요한 코드를 줄일 수 있다.)

동작 다중 상속

디폴트 메서드를 이용하여 다중 상속 기능도 구현할 수 있다. (자바에서 클래스는 한 개의 다른 클래스만 상속할 수 있지만 인터페이스는 여러 개를 구현할 수 있기 때문)
인터페이스에 디폴트 구현을 포함하면 디폴트 메서드만 수정하여도 자동으로 모든 구현 클래스에서도 변경된 코드를 상속 받는다(단 구현 클래스에서 재정의하지 않은 경우)

해석 규칙

인터페이스는 여러 개를 상속받을 수 있어서 같은 시그니처를 갖는 디폴트 메서드를 상속받는 상황이 생길 수 있다.
이러한 경우는 세 가지 규칙을 따라야 한다.

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

참고문서

모던 자바 인 액션 - 라울 게이브리얼 우르마, 마리오 푸스코, 앨런 마이크로소포트