Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 8 디폴트 메서드 vs 정적 인터페이스 메서드: 핵심 차이점 완벽 정리

Java 8부터 인터페이스에 디폴트 메서드(Default Method)정적 메서드(Static Method)를 정의할 수 있게 되었습니다. 두 메서드는 비슷해 보이지만 용도와 동작 방식에서 중요한 차이가 있습니다.

Oracle Javadocs의 공식 정의

Oracle의 Javadocs에 따르면 다음과 같습니다.

  • 디폴트 메서드: 라이브러리의 인터페이스에 새로운 기능을 추가하면서도, 해당 인터페이스의 이전 버전용으로 작성된 코드와의 바이너리 호환성을 보장할 수 있게 해줍니다.
  • 정적 메서드: 객체가 아닌 메서드가 정의된 클래스 자체에 연결되는 메서드입니다. 해당 클래스의 모든 인스턴스가 이 정적 메서드를 공유합니다.

즉, 인터페이스의 정적 메서드는 인터페이스의 일부이기 때문에 구현 클래스에서 오버라이드(재정의)할 수 없습니다. 반면 디폴트 메서드는 구현 클래스에서 자유롭게 오버라이드할 수 있습니다.

디폴트 메서드와 정적 메서드 비교표

번호구분정적 인터페이스 메서드디폴트 메서드
1기본 개념인터페이스에만 속하는 정적 메서드로, 구현 코드를 인터페이스 내부에 직접 작성할 수 있습니다.default 키워드를 사용해 선언하는 메서드로, 구현 클래스에서 오버라이드할 수 있습니다.
2메서드 호출 방식인터페이스 이름을 통해서만 호출할 수 있으며, 구현 클래스 객체로는 호출할 수 없습니다.인터페이스 참조와 구현 클래스 객체 양쪽 모두에서 호출할 수 있습니다.
3메서드 이름 충돌인터페이스와 구현 클래스가 같은 이름의 정적 메서드를 서로 영향을 주지 않고 가질 수 있습니다.구현 클래스에서 디폴트 메서드를 오버라이드하여 동작을 변경할 수 있습니다.
4주요 사용 사례유틸리티(Utility) 성격의 헬퍼 메서드로 활용하기 적합합니다.모든 구현 클래스에 공통 기능을 제공할 때 사용합니다.

디폴트 메서드와 정적 메서드 예제 코드

public interface DefaultStaticExampleInterface {
    default void show() {
        System.out.println("In Java 8- default method - DefaultStaticExampleInterface");
    }
    static void display() {
        System.out.println("In DefaultStaticExampleInterface I");
    }
}
public class DefaultStaticExampleClass implements DefaultStaticExampleInterface {
}
public class Main {
    static void main(String args[]) {
        // 인터페이스 이름으로 정적 메서드 호출
        DefaultStaticExampleInterface.display();
        DefaultStaticExampleClass defaultStaticExampleClass = new DefaultStaticExampleClass();

        // 구현 클래스 객체로 디폴트 메서드 호출
        defaultStaticExampleClass.show();
    }
}

실행 결과

In DefaultStaticExampleInterface I
In Java 8- default method - DefaultStaticExampleInterface

정리

정적 메서드는 인터페이스에 소속된 유틸리티 함수로, 반드시 인터페이스 이름(인터페이스명.메서드명())을 통해 호출해야 하며 상속되지 않습니다. 반면 디폴트 메서드는 구현 클래스에 기본 동작을 물려주는 역할을 하며, 필요하다면 구현 클래스에서 오버라이드해 자신만의 로직으로 대체할 수 있습니다. 이 두 기능을 잘 활용하면 기존 코드의 호환성을 유지하면서도 인터페이스를 유연하게 확장할 수 있습니다.