자바 8(Java 8)부터 인터페이스는 디폴트(default) 메서드를 지원하기 시작했습니다. 그런데 여러 디폴트 메서드에서 동일한 로직이 반복되는 경우가 종종 발생합니다. 이럴 때 코드 재사용성을 높이기 위해 공통 로직을 별도의 디폴트 메서드로 분리해 작성할 수 있습니다.
하지만 문제는 공통 코드가 외부에 노출되어서는 안 되는 기밀성 있는 코드일 때 발생합니다. 디폴트 메서드는 본질적으로 public이기 때문에, 해당 인터페이스를 구현하는 모든 클래스가 접근할 수 있습니다. 즉, 숨기고 싶은 코드를 디폴트 메서드에 두는 것은 바람직하지 않습니다.
이러한 한계를 해결하기 위해 자바 9(Java 9)부터는 인터페이스 내부에 프라이빗(private) 메서드를 정의할 수 있게 되었습니다. 프라이빗 메서드는 해당 인터페이스 내부에서만 접근할 수 있으므로, 구현 클래스나 외부로부터 감춰야 하는 기밀 코드를 안전하게 캡슐화할 수 있습니다. 이것이 바로 인터페이스에 프라이빗 메서드가 추가된 핵심적인 이유입니다.
문법(Syntax)
private void methodName() {
// 실행할 문장들
}예제(Example)
아래 예제에서는 디폴트 메서드 multiply()가 내부적으로 프라이빗 메서드 division()을 호출하는 구조를 보여줍니다.
interface Operation {
default void addition() {
System.out.println("default method addition");
}
default void multiply() {
division();
System.out.println("default method multiply");
}
// 프라이빗 메서드: 인터페이스 내부에서만 호출 가능
private void division() {
System.out.println("private method division");
}
}
class PrivateMethodTest implements Operation {
public static void main(String args[]) {
PrivateMethodTest test = new PrivateMethodTest();
test.multiply();
}
}실행 결과(Output)
private method division default method multiply
정리
- 디폴트 메서드 간 중복 코드를 제거하고 재사용성을 높일 수 있습니다.
- 외부에 노출되면 안 되는 헬퍼(helper) 로직을 안전하게 숨길 수 있습니다.
- 인터페이스의 캡슐화 수준이 향상되어 더 깔끔하고 유지보수하기 쉬운 설계가 가능합니다.