열렬히.뛰기

모던 자바 13. 디폴트 메서드

Language > 프로그래밍 언어 > Java > 모던 자바 > 모던 자바 13. 디폴트 메서드

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 {
    // 컴파일 에러 발생
}

해결 규칙

  1. 클래스 메서드 > 인터페이스 디폴트 메서드
  2. 더 구체적인 인터페이스가 우선
  3. 그래도 모호하면 → 직접 구현을 강제
java
class C implements A, B {
    @Override
    public void hello() {
        A.super.hello();
    }
}

디폴트 메서드 vs 추상 클래스

구분 디폴트 메서드 추상 클래스
다중 상속 가능 불가능
상태(field) 불가능 가능
생성자 없음 있음
목적 인터페이스 진화 공통 로직 + 상태

6. 언제 사용해야 하는가?

  • 라이브러리/프레임워크 설계 시
  • 기존 인터페이스를 하위 호환성 유지하며 확장해야 할 때
  • 공통 동작을 제공하되, 구현체의 자유를 남기고 싶을 때
    ❌ 일반 애플리케이션 코드에서 남용은 지양

7. 핵심 정리

  • 디폴트 메서드는 자바 API 진화를 위한 설계 도구
  • 실무에서 자주 구현할 일은 적음
  • 충돌 규칙만 명확히 이해하면 충분