디폴트 메서드

sungs·2025년 9월 5일

자바

목록 보기
92/95

디폴트 메서드

자바에서 하위 호환성을 보장하기 위해 도입한, 인터페이스 추상 메서드에 메서드 구현부를 달아 디폴트 메서드를 구현할 수 있도록 해둔 것이다. 디폴트 메서드를 구현하려고 하는 추상 메서드 앞에 default라는 키워드를 붙이면 된다. 그러면 일반 메서드처럼 로직을 인터페이스 추상 메서드에 구현할 수 있게 된다.

public interface Playable {
    // 구현해야 하는 추상 메서드
    void play();

    // 구현하지 않아도 되는 디폴트 메서드
    default void stop() {
        System.out.println("재생을 멈춥니다.");
    }
}

도입된 이유

디폴트 메서드가 도입된 이유는 인터페이스에 메서드가 추가되면 이를 구현한 클래들에 컴파일 오류가 생긴다는 문제점을 해결하기 위해서다. 이러한 문제점으로 인해 기존 인터페이스에 새로운 메서드를 도입하기 어려웠다. 한 개의 새로운 메서드를 도입해도 이를 구현한 기존 수많은 클래스에 일일이 그 새로운 메서드를 구현해줘야 했기 때문이다. 이러면 개발자들뿐만 아니라 자바측에서도 리스트나 컬렉션 같은 인터페이스를 활용한 기능에 새로운 기능을 추가하기 힘들어진다. 그래서 자바에서 디폴트 메서드를 도입했다. 이 디폴트 메서드를 도입하면 기존 클래스에서 일일이 구현하지 않아도 디폴트 메서드가 실행되어 예외가 안 터지게 된다.

디폴트 메서드를 도입함으로써 하위 호환성이 보장되어 리스트나 컬렉션, 스트림에 추가적으로 기능을 구현할 수 있게 되었다. 그뿐만 아니라 각 클래스마다 공유되는 기능도 디폴트 메서드로 구현이 가능하다.

디폴트 메서드 사용법

디폴트 메서드는 절대 남발해서는 안 된다. 쓰더라도 간단한 로직만을 써야 하며, 상태는 넣을 수 없다. 정말로 필요한 곳에만 간단하게 써야한다. 왜냐하면 인터페이스는 메서드가 반드시 구현되어야 한다는 계약 역할만을 해야하는 데다가 다중 상속으로 인해 동일한 시그니처 메서드의 디폴트 메서드끼리 충돌할 수 있기 때문이다. 디폴트 메서드는 이미 여러 클래스에 구현된 인터페이스에 새로운 메서드를 추가할 때 예외가 안 터지도록 하는 역할만 해야한다. 새로운 메서드를 구현해야할 클래스 수가 적거나 간단하게 구현이 된다면 직접 구현하는 게 좋다.

profile
앱 개발 공부 중

0개의 댓글