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

Java 9의 Optional.ifPresentOrElse()와 Optional.or() 메서드, 무엇이 다를까?

Java 9에서는 Optional 클래스의 기능을 한층 강화하기 위해 ifPresentOrElse()or() 두 가지 메서드가 새롭게 도입되었습니다. 두 메서드 모두 값의 존재 여부를 처리하지만, 그 목적과 동작 방식에는 뚜렷한 차이가 있습니다.

Optional.ifPresentOrElse() 메서드는 값이 존재하면 해당 값을 인자로 받아 지정된 동작(action)을 수행하고, 값이 없으면 빈 상태일 때 실행할 동작(empty action)을 대신 수행합니다. 즉, 값의 유무에 따라 서로 다른 로직을 분기 처리할 때 유용합니다.

반면 Optional.or() 메서드는 값이 존재하면 그 값을 담고 있는 Optional을 그대로 반환하고, 값이 없으면 Supplier 함수가 제공하는 대체 Optional을 반환합니다. 주로 기본값이나 대체 값을 지정하는 용도로 활용됩니다.

매개변수 구성에서도 차이가 있습니다. ifPresentOrElse()ConsumerRunnable 두 개의 매개변수를 받지만, or()Supplier 하나만을 매개변수로 받습니다.

Optional.ifPresentOrElse() 문법

public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

예제

import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;

public class IfPresentOrElseMethodTest {
    public static void main(String args[]) {
        optionalIsPresent();
        optionalIsEmpty();
    }
    private static void optionalIsPresent() {
        Optional<String> optional = Optional.of("Test");
        AtomicInteger successCounter = new AtomicInteger();
        AtomicInteger emptyOptionalsCounter = new AtomicInteger();

        optional.ifPresentOrElse(x -> successCounter.incrementAndGet(),
                () -> emptyOptionalsCounter.incrementAndGet());

        System.out.println(successCounter.get());
        System.out.println(emptyOptionalsCounter.get());
    }
    private static void optionalIsEmpty() {
        Optional<String> optional = Optional.empty();
        AtomicInteger successCounter = new AtomicInteger();
        AtomicInteger emptyOptionalsCounter = new AtomicInteger();

        optional.ifPresentOrElse(x -> successCounter.incrementAndGet(),
                () -> emptyOptionalsCounter.incrementAndGet());

        System.out.println(successCounter.get());
        System.out.println(emptyOptionalsCounter.get());
    }
}

실행 결과

1
0
0
1

위 결과에서 볼 수 있듯이, 값이 존재하는 경우에는 성공 카운터가 증가하고(1, 0), 값이 비어 있는 경우에는 빈 상태 카운터가 증가합니다(0, 1).

Optional.or() 문법

public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)

예제

import java.util.Optional;

public class OptionalOrMethodTest {
    public static void main(String args[]) {
        optionalIsPresent();
        optionalIsEmpty();
    }
    private static void optionalIsPresent() {
        Optional<String> optional1 = Optional.of("Test1");
        Optional<String> optional2 = Optional.of("Test2");

        Optional<String> optional3 = optional1.or(() -> optional2);
        System.out.println(optional3.get());
    }
    private static void optionalIsEmpty() {
        Optional<String> optional1 = Optional.empty();
        Optional<String> optional2 = Optional.of("Test2");

        Optional<String> optional3 = optional1.or(() -> optional2);
        System.out.println(optional3.get());
    }
}

실행 결과

Test1
Test2

값이 이미 존재하는 경우 원래의 값(Test1)이 반환되고, 값이 비어 있는 경우에만 Supplier가 제공하는 대체 Optional의 값(Test2)이 반환되는 것을 확인할 수 있습니다.

정리

ifPresentOrElse()는 값의 유무에 따라 부수 효과(side effect)를 실행하는 데 적합하고, or()는 값이 없을 때 대체 Optional을 체인 형태로 연결하는 데 적합합니다. 상황에 맞게 두 메서드를 활용하면 null 검사 코드를 더욱 깔끔하고 안전하게 작성할 수 있습니다.