Java 9부터는 인터페이스(interface) 내부에 private 메서드와 private static 메서드를 추가할 수 있게 되었습니다. 인터페이스에서 private 메서드를 활용하면 default 메서드와 static 메서드 사이의 코드 중복을 효과적으로 줄일 수 있다는 점이 가장 큰 장점입니다.
예를 들어, 두 개 이상의 default 메서드가 동일한 로직을 공유해야 하는 상황이라면, 해당 코드를 별도의 private 메서드로 분리한 뒤 각 default 메서드에서 호출하는 방식으로 깔끔하게 재사용할 수 있습니다.
Java 9 인터페이스에 정의 가능한 멤버
Java 9에서는 인터페이스에 다음과 같은 변수/메서드를 정의할 수 있습니다.
- 상수(Constant) — public static final 변수
- 추상 메서드(Abstract Method)
- 디폴트 메서드(Default Method)
- 정적 메서드(Static Method)
- private 메서드 — Java 9부터 추가
- private static 메서드 — Java 9부터 추가
예제 코드
import java.util.*;
import java.util.stream.*;
interface InterfaceTest {
static void printEvenNumbers() {
getDataStream().filter(i -> i%2==0).forEach(System.out::println);
}
static void printOddNumbers() {
getDataStream().filter(i -> i%2!=0).forEach(System.out::println);
}
// private static 메서드 — 두 static 메서드가 공통으로 사용
private static Stream<Integer> getDataStream() {
List<Integer> list = Arrays.asList(10, 13, 5, 15, 12, 20, 11, 25, 16);
return list.stream();
}
}
public class InterfacePrivateMethodTest implements InterfaceTest {
public static void main(String args[]) {
System.out.println("짝수 목록:");
InterfaceTest.printEvenNumbers();
System.out.println("홀수 목록:");
InterfaceTest.printOddNumbers();
}
}실행 결과
짝수 목록: 10 12 20 16 홀수 목록: 13 5 15 11 25
위 예제에서 getDataStream()이라는 private static 메서드는 짝수 출력 메서드와 홀수 출력 메서드가 데이터 스트림을 얻는 공통 로직을 담당합니다. 이처럼 private 메서드를 사용하면 외부에는 노출하지 않으면서도 인터페이스 내부에서만 코드를 공유할 수 있어 유지보수성이 크게 향상됩니다.