Java 8 기본 메서드 설명: 인터페이스 향상 및 하위 호환성
Java 8은 인터페이스에 기본 메서드 구현이라는 새로운 개념을 도입했습니다. 이 기능은 기존 인터페이스가 Java 8의 람다 표현식 기능을 활용할 수 있도록 하위 호환성을 위해 추가되었습니다.
예를 들어, List나 Collection 인터페이스에는 forEach 메서드 선언이 없습니다. 따라서 이러한 메서드를 단순히 추가하면 컬렉션 프레임워크 구현이 깨집니다. Java 8은 기본 메서드를 도입해 List/Collection 인터페이스가 forEach 메서드의 기본 구현을 가질 수 있게 하고, 이 인터페이스를 구현하는 클래스는 이를 구현할 필요가 없도록 했습니다.
구문
public interface Vehicle {
default void print() {
System.out.println("I am a vehicle!");
}
}
다중 기본 메서드 충돌 해결
인터페이스에 기본 함수가 있으면, 한 클래스가 같은 기본 메서드를 가진 두 인터페이스를 구현할 가능성이 있습니다. 다음 코드로 이 모호성을 해결하는 방법을 설명합니다.
public interface Vehicle {
default void print() { System.out.println("I am a vehicle!"); }
}
public interface FourWheeler {
default void print() { System.out.println("I am a four wheeler!"); }
}
첫 번째 해결책: 기본 구현을 오버라이드하는 자체 메서드 생성
public class Car implements Vehicle, FourWheeler {
public void print() { System.out.println("I am a four wheeler car vehicle!"); }
}
두 번째 해결책: super를 사용해 지정된 인터페이스의 기본 메서드 호출
public class Car implements Vehicle, FourWheeler {
public void print() { Vehicle.super.print(); }
}
정적 기본 메서드
Java 8부터 인터페이스에 정적 헬퍼 메서드도 가질 수 있습니다.
public interface Vehicle {
default void print() { System.out.println("I am a vehicle!"); }
static void blowHorn() { System.out.println("Blowing horn!!!"); }
}
기본 메서드 예제
원하는 에디터로 다음 Java 프로그램 생성 (예: C:\JAVA).
Java8Tester.java
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!");
}
}
결과 검증
javac 컴파일러로 클래스 컴파일:
C:\JAVA> javac Java8Tester.java
Java8Tester 실행:
C:\JAVA> java Java8Tester
다음 출력 생성:
I am a vehicle!
I am a four wheeler!
Blowing horn!!!
I am a car!