Java 인터페이스의 default 메서드
선수학습(1개)
요약
Java 8에서 도입된 인터페이스 default 메서드의 문법과, 여러 인터페이스에 같은 default 메서드가 있을 때 발생하는 충돌 해결법을 정리합니다.
핵심 정리
| 개념 | 설명 | 예시 |
|---|---|---|
| default 메서드 | 인터페이스 안에 본문을 가진 메서드 (Java 8 도입) | default void sayBye() { ... } |
| 재정의 (선택) | 구현 클래스가 부모의 메서드를 덮어쓰는 것(오버라이딩) | @Override public void sayBye() { ... } |
| 다중 구현 충돌 | 두 인터페이스에 메서드 이름·매개변수가 같은 default가 있으면 컴파일 에러 | class C implements A, B |
인터페이스.super.메서드() | 충돌 시 특정 인터페이스의 default를 직접 호출 | A.super.hello(); |
default 메서드란? 호기심
Java 8부터 인터페이스 안에 본문을 가진 메서드를 선언할 수 있습니다. 이것을 default 메서드라고 합니다. 메서드 선언 앞에 default 키워드를 붙이고, 중괄호 { } 안에 기본 구현을 작성합니다.
default 메서드는 구현 클래스가 재정의하지 않아도 기본 동작을 제공합니다.
왜 Java 8에 도입되었나요?
Java 8 이전에는 인터페이스에 새 메서드를 추가하면 그 인터페이스를 구현한 모든 클래스가 컴파일 에러가 났습니다. 추상 메서드는 구현이 필수이기 때문입니다. 그래서 라이브러리가 한번 배포되면 새 메서드를 추가하기가 매우 어려웠습니다.
default 메서드 덕분에 인터페이스에 새 메서드를 기본 동작과 함께 추가할 수 있고, 기존 구현 클래스들은 그대로 두어도 컴파일 에러 없이 동작합니다. 대표적으로 Java 8에서 Collection1 인터페이스에 stream(), forEach() 같은 default 메서드가 추가되었습니다.
| 메서드 종류 | 본문 | 구현 필수? | 특징 |
|---|---|---|---|
| 추상 메서드 | 없음 (;으로 끝) | 필수 | 모든 구현 클래스가 반드시 작성 |
| default 메서드 | 있음 ({ }로 끝) | 선택 | 기본 구현 제공, 필요 시 재정의 |
default 메서드 재정의 호기심
구현 클래스는 default 메서드를 선택적으로 오버라이딩해 다른 동작을 제공할 수 있습니다.
재정의한 클래스에서 메서드를 호출하면 재정의된 구현이 실행되고, 재정의하지 않은 클래스에서는 인터페이스의 default 구현이 실행됩니다.
다중 인터페이스 default 충돌 호기심
한 클래스가 여러 인터페이스를 구현할 때 각 인터페이스에 이름·매개변수가 같은 default 메서드2가 있으면 어느 구현을 쓸지 모호해집니다. 이 경우 Java는 컴파일 에러를 발생시키고, 구현 클래스가 직접 해결하도록 강제합니다.

인터페이스.super.메서드()로 해결
구현 클래스에서 해당 메서드를 직접 오버라이딩한 뒤, 필요하다면 인터페이스이름.super.메서드() 구문으로 특정 인터페이스의 기본 구현을 호출합니다.
| 표현 | 의미 | 예시 |
|---|---|---|
super.메서드() | 부모 클래스의 메서드 호출 (상속에서 사용) | 클래스 Animal을 상속한 Dog 안에서 super.eat()으로 Animal의 eat() 호출 |
인터페이스.super.메서드() | 특정 인터페이스의 default 메서드 호출 | 인터페이스 A를 구현한 C 안에서 A.super.hello()로 A의 default hello() 호출 |
해결 우선순위 규칙 호기심
Java가 default 메서드를 선택하는 순서:

-
클래스 우선: 클래스에서 직접 선언한 메서드나 상속받은 메서드가 있으면 인터페이스의 default보다 먼저 사용됩니다.
java코드 하이라이팅 중... -
더 구체적인 인터페이스 우선: 한 인터페이스가 다른 인터페이스를 extends 한다면, 하위 인터페이스의 default가 상위의 default를 가립니다.
java코드 하이라이팅 중... -
충돌이면 에러: 위 두 규칙으로 해결되지 않으면 컴파일 에러. 개발자가 직접 오버라이딩해야 합니다.
java코드 하이라이팅 중...