Java 9에서는 Optional<T> 클래스에 stream(), or(), ifPresentOrElse() 세 가지 새로운 메서드가 추가되었습니다. 이 중 or() 메서드는 값이 없는 상황을 더욱 우아하게 처리할 수 있게 해주는 핵심 기능입니다.
애초에 Optional 클래스가 도입된 목적은 NullPointerException(널 포인터 예외)을 방지하는 것이었습니다. Java 9의 or() 메서드는 이러한 안전성을 한 단계 더 발전시켜 줍니다.
Optional.or() 메서드란?
or() 메서드는 값이 존재하면 해당 값을 담고 있는 Optional을 그대로 반환합니다. 반면 값이 비어 있다면, 인자로 전달된 공급 함수(Supplier)가 생성한 대체 Optional을 반환합니다. 즉, 빈 Optional일 때만 대체 로직이 실행되므로 불필요한 연산을 피할 수 있습니다.
문법(Syntax)
public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)
사용 예제(Example)
import java.util.Optional;
import java.util.function.Supplier;
public class OptionalOrTest {
public static void main(String args[]) {
Optional<String> optional = Optional.of("TutorialsPoint");
Supplier<Optional<String>> supplierString = () -> Optional.of("Not Present");
optional = optional.or(supplierString);
optional.ifPresent(x -> System.out.println("Value: " + x));
optional = Optional.empty();
optional = optional.or(supplierString);
optional.ifPresent(x -> System.out.println("Value: " + x));
}
}실행 결과(Output)
Value: TutorialsPoint Value: Not Present
동작 방식 분석
위 예제를 살펴보면 다음과 같은 흐름으로 동작합니다.
1. 첫 번째 경우에는 Optional.of("TutorialsPoint")로 값이 존재하므로, or() 메서드를 호출해도 원래 값인 "TutorialsPoint"가 그대로 유지됩니다. Supplier는 실행되지 않습니다.
2. 두 번째 경우에는 Optional.empty()로 값이 비어 있으므로, or() 메서드가 Supplier를 실행하여 "Not Present"라는 대체 값을 반환합니다.
or() 메서드의 장점
- 지연 평가(Lazy Evaluation): Supplier 형태로 전달되기 때문에 실제로 필요한 순간까지 대체 값 생성이 지연됩니다.
- 메서드 체이닝: Optional 타입을 반환하므로 map(), filter() 등 다른 Optional 메서드와 자연스럽게 연결할 수 있습니다.
- null 처리 코드 간소화: 기존의 isPresent() 조건문이나 복잡한 삼항 연산자 없이도 깔끔하게 기본값 로직을 구현할 수 있습니다.