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
'개발 > 자바' 카테고리의 다른 글
| Java의 Wrapper 클래스 개요 및 차이점 (0) | 2025.02.19 |
|---|---|
| Java 14 switch 표현식 (switch expression) (0) | 2025.02.18 |
| Java 추상 클래스 (abstract class) (0) | 2025.02.18 |
| Java Enum (열거형) (0) | 2025.02.18 |
| 중첩 클래스 (Nested Class) - Inner Class vs Static Nested Class (0) | 2025.02.18 |