Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9 Optional.or() 메서드 완벽 이해하기: 개념, 문법, 실전 예제

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() 조건문이나 복잡한 삼항 연산자 없이도 깔끔하게 기본값 로직을 구현할 수 있습니다.