HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
✍🏻
Learnary (learn - diary)
/
🕠
orElse 와 orElseGet 차이 [Optional]
🕠

orElse 와 orElseGet 차이 [Optional]

progress
Done
Tags
Java
💨What❓Why✅How[어떻게 써야 잘 쓸까?]📌 REFER

💨What

  • Optional의 쓰이는 메소드로서 체이닝 형식으로 사용되어 질 수 있다.
 
Optional<String> name = Optional.ofNullable("엘리자베스"); name.~~~
notion image

❓Why

  • 호출로 인해 메모리 상에 이슈가 발생할 수 있다.
  • 혹은 함수를 호출하는데 응답시간에 지연이 생긴다.
  • 결과적으로 createDefault의 호출 여부에 따라 다르다는 것을 알 수 있다.
    • notion image
 
예제 코드
package com.programmers.objectstudy; import java.time.LocalDateTime; import java.util.Optional; public class Main { public static void main(String[] args) throws InterruptedException { testOrElseOfStream(); System.out.println("===============boundary================"); testOrElseGetOfStream(); } private static void testOrElseGetOfStream() throws InterruptedException { Optional<String> name = Optional.ofNullable("엘리자베스"); System.out.println(getLogTime("orElseGet 시작 시간")); name.orElseGet(() -> { try { return createDefault(); } catch (InterruptedException e) { throw new RuntimeException(e); } }); System.out.println(getLogTime("orElseGet 종료 시간")); } private static void testOrElseOfStream() throws InterruptedException { Optional<String> name = Optional.ofNullable("엘리자베스"); System.out.println(getLogTime("orElse 시작 시간")); name.orElse(createDefault()); System.out.println(getLogTime("orElse 종료 시간")); } public static String getLogTime(String prefix) { return prefix + " : " + LocalDateTime.now().getSecond(); } public static String createDefault() throws InterruptedException { System.out.println("Main.createDefault 실행 @@@@"); ; Thread.sleep(1000); return "DEFAULT_NAME"; } }

✅How[어떻게 써야 잘 쓸까?]

⚠️
무조건적으로 값이 여부는 상관없이 호출되는 orElse 메소드는 성능의 이슈가 생길 수 있다.
  • orElse문은 되도록이면 피해야 맞는 것이다.(무거운 작업이 진행될 경우에는 더더욱 피해야 한다)

📌 REFER

orElseGet()과 orElse()의 차이
cfdf.tistory.com/34 orElse와 orElseGet에 대해 흥미로운 글을 봤다. 무심코 넘겼던 부분인데 둘은 꽤 중요한 차이가 있다. orElse(Value)는 Value가 메모리 상에 존재한다고 가정하므로, Value가 함수의 리턴값이라면 Optional 내부 값이 null이건 말건 함수를 실행시켜 Value을 가져온다. orElse문 안의 Value는 메모리상에 존재한다고 가정하기 때문에 name.orElse(createDefaultName())에서 name이 null이 아님에도 orElse문 안의 createDefaultName() 함수가 호출된다.
orElseGet()과 orElse()의 차이
https://onduway.tistory.com/85
orElseGet()과 orElse()의 차이