인터페이스에서 정적 메소드란?
자바 8(Java 8)부터는 인터페이스 내부에 정적(static) 헬퍼 메소드를 직접 정의할 수 있게 되었습니다. 기존에는 인터페이스가 추상 메소드만 가질 수 있었지만, 자바 8에서 도입된 디폴트 메소드(default method)와 함께 정적 메소드도 지원되면서 인터페이스의 활용 범위가 크게 넓어졌습니다.
정적 메소드는 인터페이스 이름을 통해 직접 호출하며, 구현 클래스나 객체 생성 없이 사용할 수 있다는 점이 특징입니다.
기본 문법 예시
public interface Vehicle {
default void print() {
System.out.println("I am a vehicle!");
}
static void blowHorn() {
System.out.println("Blowing horn!!!");
}
}위 코드에서 blowHorn()은 정적 메소드로 선언되었습니다. 이 메소드는 Vehicle.blowHorn() 형태로 호출할 수 있습니다.
전체 예제 코드
아래 예제는 하나의 클래스가 두 개의 인터페이스를 동시에 구현하는 상황을 보여줍니다. 각 인터페이스에 같은 이름의 디폴트 메소드가 존재할 때, 구현 클래스에서 반드시 오버라이딩해야 하며, 이때 InterfaceName.super.methodName() 문법으로 특정 인터페이스의 디폴트 메소드를 명시적으로 호출할 수 있습니다.
public class Java8Tester {
public static void main(String args[]) {
Vehicle vehicle = new Car();
vehicle.print();
}
}
interface Vehicle {
default void print() {
System.out.println("I am a vehicle!");
}
static void blowHorn() {
System.out.println("Blowing horn!!!");
}
}
interface FourWheeler {
default void print() {
System.out.println("I am a four wheeler!");
}
}
class Car implements Vehicle, FourWheeler {
public void print() {
Vehicle.super.print();
FourWheeler.super.print();
Vehicle.blowHorn();
System.out.println("I am a car!");
}
}실행 결과
I am a vehicle!
I am a four wheeler!
Blowing horn!!!
I am a car!
핵심 포인트 정리
- 정적 메소드 호출 방식: 정적 메소드는 객체가 아닌 인터페이스 이름으로 호출합니다. 예:
Vehicle.blowHorn() - 상속 불가: 인터페이스의 정적 메소드는 구현 클래스로 상속되지 않으므로, 구현 클래스에서
Car.blowHorn()처럼 호출할 수 없습니다. - 다중 구현 충돌 해결: 여러 인터페이스가 동일한 디폴트 메소드를 가질 경우, 구현 클래스에서 오버라이딩하고
Vehicle.super.print()와 같은 문법으로 원본 메소드를 선택적으로 호출해야 합니다. - 유틸리티 메소드 배치: 정적 메소드를 활용하면 별도의 유틸리티 클래스 없이도 관련 헬퍼 기능을 인터페이스 안에 응집도 높게 배치할 수 있습니다.
이처럼 자바 8의 정적 메소드와 디폴트 메소드는 인터페이스 설계의 유연성을 크게 향상시켜 주며, API 진화와 코드 재사용성 측면에서 매우 유용한 기능입니다.