java에서 null처리는 하는 데에 Optional<>을 자주 쓰게 됩니다.
이 Optional<>의 메서드중 orElse와 orElseGet에 대해서 알아보았습니다.
우선 결론부터 말하자면 orElse는 null이던 아니던 파라미터으로 넘어온 메서드가 항상 호출되고, orElseGet은 null인 경우에만 호출됩니다. 이는 orElseGet가 supplier를 사용하기 때문에 벌어지는 것 입니다!
public T orElse(T other) {
return value != null ? value : other;
}
public T orElseGet(Supplier<? extends T> supplier) {
return value != null ? value : supplier.get();
}
orElse의 경우 value가 null인 경우 other자체를 리턴하고 있습니다.
하지만 orElseGet의 경우 supplier.get()를 리턴하고 있습니다.
supplier의 경우 함수형 인터페이스로 get()를 제공하고 있는데, 이는 lazy evaluation 특징이 있습니다. 실제로 .get()이 호출될 때 연산되는 것입니다. 따라서 두 메서드 모두 항상 실행되지만 orElseGet은 null인 경우에만 파라미터로 넘어온 메서드를 사용하게 됩니다.
그럼 한번 확인해보겠습니다.
위에서 orElseGet은 supplier를 사용하여 lazy하게 호출 된다는 특징이 있다고 했습니다.
그럼 이를 확인해보도록 합시다.
테스트를 위해 Optional클래스를 간단하게 구현한 custom<> 클래스를 사용하여 테스트 해보겠습니다.