Chapter 13. 디폴트 메서드
들어가며
-
인터페이스에 새로운 메서드를 추가하는 등 인터페이스를 바꾸고 싶을 때 발생하는 문제를 해결할 수 있게 됐다.
-
기본 구현을 포함하는 인터페이스를 정의하는 두가지 방법
- 인터페이스 내부에 정적 메서드를 사용한다.
- 인터페이스의 기본 구현을 제공할 수 있도록 디폴트 메서드 기능을 사용한다.
-
기존 인터페이스를 구현하는 클래스는 자동으로 인터페이스에 추가된 새로운 메서드의 디폴트 메서드를 상속 받게 된다.
-
default
키워드: 해당 메서드가 디폴트 메서드임을 가리킨다.
13.1 변화하는 API
- 바이너리 호환성: 새로 추가된 메서드를 호출하지만 않으면 새로운 메서드 구현이 없이도 기존 클래스 파일 구현이 잘 동작한다.
- 뭔가를 바꾼 이후에도 에러 없이 기존 바이너리가 실행될 수 있는 상황
- 인증, 준비, 해석 등의 과정이 포함된다.
- 인터페이스에 메서드를 추가 했을 때 추가된 메서드를 호출하지 않는 이상 문제가 발생하지 않는다.
- 소스 호환성: 코드를 고쳐도 기존 프로그램을 성공적으로 재컴파일할 수 있음을 의미한다.
- 동작 호환성: 코드를 바꾼 다음에도 같은 입력값이 주어지면 프로그램이 같은 동작을 실행한다는 의미이다.
13.2 디폴트 메서드란?
-
인터페이스를 구현하는 클래스에서 구현하지 않은 메서드는 인터페이스 자체에서 기본으로 제공한다.
-
인터페이스를 구현하는 모든 클래스는 default
메서드의 구현도 상속 받는다.
-
함수형 인터페이스는 오직 하나의 추상 메서드를 포함한다.
- 디폴트 메서드는 추상 메서드에 해당하지 않는다.
- 따라서 함수형 인터페이스도 디폴트 메서드를 가질 수 있다.
추상 클래스와 인터페이스
- 공통점
- 추상 메서드와 바디를 포함하는 메서드를 정의할 수 있다.
- 차이점
- 클래스는 하나의 추상 클래스만 상속받을 수 있지만, 인터페이스를 여러 개 구현할 수 있다.
- 추상 클래스는 인스턴스 변수(필드)로 공통 상태를 가질 수 있다. 인터페이스는 인스턴스 변수를 가질 수 없다.
13.3 디폴트 메서드 활용 패턴
동작 다중 상속
13.4 해석 규칙
같은 시그니처를 갖는 두 메서드를 상속받는 클래스 문제
- 해결 규칙
- 클래스가 항상 우선이다. 클래스나 슈퍼클래스에서 정의한 메서드가 디폴트 메서드보다 우선권을 갖는다.
- 서브 인터페이스가 그 다음이다. 상속 관계를 갖는 인터페이스에서 같은 시그니처를 갖는 메서드를 정의할 때, 서브 인터페이스가 우선권을 갖는다.
- 여러 인터페이스를 상속받는 클래스가 명시적으로 디폴트 메서드를 오버라이드하고 호출해야한다.