1. 디폴트 메서드란?
- 인터페이스에 구현을 가진 메서드를 정의할 수 있게 해주는 기능
default키워드를 사용함- Java 8에서 도입됨
java
interface MyInterface {
default void hello() {
System.out.println("hello");
}
}
왜 디폴트 메서드가 등장했는가?
- Java 8에서 람다, 스트림 API 도입
- List, Collection 같은 기존 인터페이스에 메서드를 추가해야 하는 상황 발생
- 하지만 인터페이스에 메서드를 추가하면 모든 구현 클래스가 깨지는 문제(backward compatibility) 발생
👉 해결책:
기존 구현체를 깨뜨리지 않고 인터페이스를 확장하기 위해 디폴트 메서드 도입
3. 디폴트 메서드의 특징
- 인터페이스에 구현 코드 포함 가능
- 구현 클래스는 해당 메서드를 자동으로 상속
- 필요하면 override 가능
- 상태(state)는 가질 수 없음 (필드 불가)
4. 디폴트 메서드 충돌 문제
java
interface A {
default void hello() {}
}
interface B {
default void hello() {}
}
class C implements A, B {
// 컴파일 에러 발생
}
해결 규칙
- 클래스 메서드 > 인터페이스 디폴트 메서드
- 더 구체적인 인터페이스가 우선
- 그래도 모호하면 → 직접 구현을 강제
java
class C implements A, B {
@Override
public void hello() {
A.super.hello();
}
}
디폴트 메서드 vs 추상 클래스
| 구분 | 디폴트 메서드 | 추상 클래스 |
|---|---|---|
| 다중 상속 | 가능 | 불가능 |
| 상태(field) | 불가능 | 가능 |
| 생성자 | 없음 | 있음 |
| 목적 | 인터페이스 진화 | 공통 로직 + 상태 |
6. 언제 사용해야 하는가?
- 라이브러리/프레임워크 설계 시
- 기존 인터페이스를 하위 호환성 유지하며 확장해야 할 때
- 공통 동작을 제공하되, 구현체의 자유를 남기고 싶을 때
❌ 일반 애플리케이션 코드에서 남용은 지양
7. 핵심 정리
- 디폴트 메서드는 자바 API 진화를 위한 설계 도구
- 실무에서 자주 구현할 일은 적음
- 충돌 규칙만 명확히 이해하면 충분