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