티스토리 뷰

Java 8에서 지원하는 Optional를 사용하면 NullPointerException에 대한 방어코드를 functional하게 처리할 수 있습니다. Optional 내부 객체가 null 일 때 기본 값을 반환하기 위해 orElse()orElseGet()를 사용할 수 있습니다. Optional이 생기기 이전에는 다음과 유사한 코드를 작성했을 것 입니다.

public void method(Object o) {
    if (o == null) {
        // null value handling
    }

    // to do something
}

이제 예시를 통해 두 메서드가 어떻게 동작하는지 살펴보겠습니다.

Optional.orElse()

private static String wontRunThis() {
    System.out.println("Won't run this");
    return "foo";
}

public void optional1() {
    String o = Optional.of("Hello World!").orElse(wontRunThis());
    System.out.println("Result : " + o);
}

Result

Won't run this
Result : Hello World!

Optional.orElseGet()

public void optional2() {
    String o = Optional.of("Hello World!").orElseGet(() -> wontRunThis());
    System.out.println("Result : " + o);
}

Result

Result : Hello World!

결과에서 확인할 수 있듯이 두 메서드 모두 내부 객체가 null이 아니기 때문에 foo는 반환하지 않고 Hello World!를 반환합니다. 하지만 orElse()는 Optional 내부 객체의 상태와 상관없이 무조건 실행되어 Won't run this를 출력하며, orElseGet()은 내부 객체가 null인 경우에만 실행됩니다. 그 이유는 orElse()의 인자로 T other를 받기 때문입니다. 때문에 예상치 못한 사이드 이펙트가 생길 수 있으므로, 상황에 맞는 알맞은 선택이 필요합니다.

댓글