개발/자바

Java 8의 Predicate 인터페이스

피터JK 2025. 2. 18. 13:06
728x90

1️⃣ Predicate란?

Predicate<T>는 매개변수를 하나 받아 논리적 판단을 수행하는 함수형 인터페이스다.
즉, 입력값을 받아 true 또는 false를 반환하는 역할을 한다.
Java 8 이상이 필요하다.

Java 8 주요 특징:

  • 람다 표현식
  • 함수형 인터페이스 (Predicate, Function, Consumer, Supplier 등)
  • Stream API (filter(), map(), reduce() 등)

Predicate 기본 구조

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
}

✔ test(T t) 메서드를 구현하여 조건을 검사하고 true 또는 false를 반환한다.
✔ @FunctionalInterface이므로 람다 표현식과 함께 사용 가능하다.


2️⃣ Predicate 사용 방법

기본적인 사용 예시

import java.util.function.Predicate;

public class PredicateExample {
    public static void main(String[] args) {
        Predicate<Integer> isEven = (n) -> n % 2 == 0;

        System.out.println(isEven.test(4)); // true
        System.out.println(isEven.test(7)); // false
    }
}

✔ isEven은 입력값이 짝수인지 확인하는 Predicate
✔ test(4)는 true, test(7)은 false 반환


3️⃣ Predicate 조합 (and(), or(), negate())

여러 조건을 조합하는 방법

import java.util.function.Predicate;

public class PredicateComposition {
    public static void main(String[] args) {
        Predicate<Integer> isPositive = (n) -> n > 0;
        Predicate<Integer> isEven = (n) -> n % 2 == 0;

        // and(): 양수이면서 짝수
        Predicate<Integer> isPositiveEven = isPositive.and(isEven);
        System.out.println(isPositiveEven.test(4));  // true
        System.out.println(isPositiveEven.test(-4)); // false

        // or(): 양수이거나 짝수
        Predicate<Integer> isPositiveOrEven = isPositive.or(isEven);
        System.out.println(isPositiveOrEven.test(-4)); // true
        System.out.println(isPositiveOrEven.test(-3)); // false

        // negate(): 조건 반전 (짝수가 아닌 숫자)
        Predicate<Integer> isOdd = isEven.negate();
        System.out.println(isOdd.test(4)); // false
        System.out.println(isOdd.test(7)); // true
    }
}

✔ and(), or(), negate() 를 사용하여 여러 조건을 결합할 수 있다.


4️⃣ 실전 예제 - 리스트 필터링

조건에 맞는 리스트 필터링

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class PredicateListFilter {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

        // 길이가 5 이상인 문자열 필터링
        Predicate<String> lengthGreaterThan4 = (s) -> s.length() > 4;

        List<String> filteredNames = names.stream()
                                          .filter(lengthGreaterThan4)
                                          .collect(Collectors.toList());

        System.out.println(filteredNames); // [Alice, Charlie, David]
    }
}

✔ filter() 와 함께 사용하여 특정 조건을 만족하는 값만 추출 가능


5️⃣ Predicate를 활용한 유효성 검사 예제

비밀번호 유효성 검사

import java.util.function.Predicate;

public class PasswordValidator {
    public static void main(String[] args) {
        Predicate<String> isLongEnough = pass -> pass.length() >= 8;
        Predicate<String> hasUpperCase = pass -> pass.chars().anyMatch(Character::isUpperCase);
        Predicate<String> hasDigit = pass -> pass.chars().anyMatch(Character::isDigit);

        Predicate<String> isValidPassword = isLongEnough.and(hasUpperCase).and(hasDigit);

        System.out.println(isValidPassword.test("Abc12345")); // true
        System.out.println(isValidPassword.test("abcdefg"));  // false
    }
}

✔ 여러 Predicate를 조합하여 복잡한 검증 로직을 간단하게 처리할 수 있다.


🎯 정리

✅ Predicate<T>는 입력값을 받아 true 또는 false를 반환하는 함수형 인터페이스
람다 표현식과 함께 사용 가능
✅ and(), or(), negate() 메서드를 이용하여 여러 조건을 조합 가능
스트림(Stream API)의 filter()와 함께 사용하면 리스트 필터링에 유용
입력값 검증(예: 비밀번호 검증) 등의 유효성 검사에서 자주 사용

🚀 "Predicate를 활용하면 조건 검사를 간단하고 유연하게 처리할 수 있다!"

728x90