티스토리 뷰
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
를 받기 때문입니다. 때문에 예상치 못한 사이드 이펙트가 생길 수 있으므로, 상황에 맞는 알맞은 선택이 필요합니다.
댓글