팁/자바
Optional 중 즉시평가, 지연평가
wcwdfu
2025. 5. 28. 04:11
1) 즉시평가, 지연평가
먼저보는 결론 ::
Optional의 orElse() 는 전달받은 인자가 즉시 평가되고, orElseGet()은 람다를 통해 전달받은 인자가 지연 평가된다.
Optional의 orElse() 와 orElseGet() 메서드를 보자.
개발자는 이런의도를 가진다.
값이 있으면 기존값을 사용하고, 없으면 새로운 값을 만들어서 사용하겠다.
그런데 새로운 값을 만들어서 사용하는 과정이 큰 비용이 발생한다.
예제1) orElse()
Optional<Integer> existedValue = Optional.of(2);
Optional<Integer> emptyValue = Optional.empty();
Integer value1 = existedValue.orElse(makeNewNum());
Integer value2 = emptyValue.orElse(makeNewNum());
다음과 같은 경우엔 값이 실재로 존재하던, 존재하지 않던 makeNewNum 매서드를 호출한다.
value1 에선 makeNewNum을 호출하고 기존 값을 할당한다. (기존 값 : 2)
즉 사용하지도 않을 값을 만들어내고 결국엔 버린다. 자원의 낭비이다.
value2 에선 makeNewNum을 호출하고 이를 통해 생선된 값을 할당한다.
예제2) orElseGet()
Integer value1 = existedValue.orElseGet( () -> makeNewNum() );
Integer value2 = emptyValue.orElseGet( () -> makeNewNum() );
이 경우엔 값이 없는 순간에서만 makeNewNum() 이 호출된다.
즉 값이 실제로 필요할 때에만 연산하는 것이다.
따라서 value2에서만 호출된다.
2) 되도록 반환타입에서만 사용한다
먼저보는 결론 ::
자바의 공식문서에서도 Optional은 매서드의 반환값으로써 사용하기를 권장한다. 매개변수로 사용하지 않는다.