PHpullh
학습 라이브러리/Java/인터페이스 — default & static & private

JAVA · 객체지향

인터페이스 — default & static & private

Java 8~9에 추가된 인터페이스의 기본 구현, 정적 메서드, private 메서드.

객체지향중급interfacedefaultstaticprivateJava 8

핵심 설명

Java 8~9에 추가된 인터페이스의 기본 구현, 정적 메서드, private 메서드.

Java code

import java.util.Objects;

// 인터페이스 — default, static, private 메서드
public interface Validator<T> {

    boolean validate(T value);   // 추상 메서드

    // default — 공통 구현 제공 (Java 8+)
    default boolean isValid(T value) {
        return validate(value);
    }

    // private — 내부 헬퍼 (Java 9+)
    private String formatError(String field) {
        return "[INVALID] " + field;
    }

    // static — 팩토리/유틸리티 (Java 8+)
    static <T> Validator<T> nonNull() {
        return Objects::nonNull;
    }

    // 다중 Validator 조합
    default Validator<T> and(Validator<T> other) {
        return value -> this.validate(value) && other.validate(value);
    }

    default Validator<T> or(Validator<T> other) {
        return value -> this.validate(value) || other.validate(value);
    }

    default Validator<T> negate() {
        return value -> !this.validate(value);
    }
}

class EmailValidator implements Validator<String> {
    @Override
    public boolean validate(String email) {
        return email != null
            && email.contains("@")
            && email.contains(".");
    }
}

class Main {
    public static void main(String[] args) {
        Validator<String> emailValidator = new EmailValidator();
        Validator<String> notEmpty = s -> s != null && !s.isEmpty();
        Validator<String> notTooLong = s -> s.length() <= 100;

        // 조합
        Validator<String> fullValidator =
            Validator.<String>nonNull()
                .and(notEmpty)
                .and(emailValidator)
                .and(notTooLong);

        System.out.println(fullValidator.isValid("dev@java.io")); // true
        System.out.println(fullValidator.isValid("invalid"));      // false
        System.out.println(fullValidator.isValid(null));           // false
    }
}

학습 팁

두 인터페이스에 같은 이름의 default 메서드가 있으면 구현 클래스에서 반드시 오버라이드해야 합니다. InterfaceName.super.method()로 특정 인터페이스의 default를 호출할 수 있습니다.

주의할 점

인터페이스의 private 메서드는 Java 9+에서만 사용 가능합니다. Java 8 이하라면 코드 중복을 감수하거나 추상 클래스를 사용해야 합니다.

자주 묻는 질문

인터페이스 — default & static & private란 무엇인가요?

Java 8~9에 추가된 인터페이스의 기본 구현, 정적 메서드, private 메서드.

인터페이스 — default & static & private 학습 시 주의할 점은 무엇인가요?

인터페이스의 private 메서드는 Java 9+에서만 사용 가능합니다. Java 8 이하라면 코드 중복을 감수하거나 추상 클래스를 사용해야 합니다.