JAVA8에서 인터페이스와 관련해 크게 변화된 점은 바로 디폴트 메서드(Default Methods)와 정적 메서드(Static Methods)를 인터페이스 내에 추가할 수 있게 된 것이다. 이러한 변경은 JAVA의 인터페이스에 더 많은 유연성을 부여하고, 람다 표현식와 함께 함수형 프로그래밍을 지원하는데 중요한 역할을 한다.
디폴트 메서드는 인터페이스에 새로운 기능을 추가하면서도 기존에 이 인터페이스를 구현한 클래스들이 해당 메서드를 구현하지 않아도 되게 하는 방법을 제공한다. 이는 기존 코드를 변경하지 않고도 인터페이스를 확장할 수 있게 해준다. 예를 들어, Vehicle 인터페이스에 stop이라는 새로운 디폴트 메서드를 추가할 때, Car 클래스는 이 메서드를 구현하지 않아도 Vehicle의 디폴트 구현을 사용할 수 있게 한다.
interface Vehicle {
// 추상 메서드
void start();
// 디폴트 메서드
default void stop() {
System.out.println("Vehicle stopped.");
}
}
class Car implements Vehicle {
@Override
public void start() {
System.out.println("Car started.");
}
// stop() 메서드는 구현하지 않아도 된다.
// Vehicle 인터페이스의 디폴트 구현을 사용할 수 있다.
}
public class Main {
public static void main(String[] args) {
Car myCar = new Car();
myCar.start();
myCar.stop(); // - 디폴트 메서드 호출
}
}
출력 결과
Car started.
Vehicle stopped.
JAVA8부터는 인터페이스 내에 정적 메서드를 정의할 수 있게 되었다. 이는 인터페이스를 구현하지않고도 인터페이스 이름으로 직접 호출할 수 있다는 것을 의미한다. 이는 유틸리티 함수나 헬퍼 메서드를 인터페이스 내에 포함시킬 수 있게 해준다. 아래 소스는 MathOperations 인터페이스에서 add와 subtract라는 두 개의 정적 메서드를 정의하였을 때, 이 메서드들은 인터페이스를 구현한 클래스의 인스턴스 없이도 호출하는 소스를 보여준다.
interface MathOperations {
static int add(int a, int b) {
return a + b;
}
static int subtract(int a, int b) {
return a - b;
}
}
public class Main {
public static void main(String[] args) {
int sum = MathOperations.add(5, 3);
int difference = MathOperations.subtract(5, 3);
System.out.println("Sum: " + sum);
System.out.println("Difference: " + difference);
}
}
출력결과
Sum: 8
Difference: 2
이러한 변화는 JAVA 에서 함수형 프로그래밍을 지원하고, 인터페이스의 활용도를 높이는 중요한 변화라고 할 수 있다. 디폴트 메서드와 정적 메서드의 추가로 JAVA 개발자들을 더욱 유연하고 강력한 코드를 작성할 수 있게 되었다.