Bibi's DevLog ๐Ÿค“๐ŸŽ

[Java] Optional, Optional์˜ ๋ฉ”์„œ๋“œ, Optional ์‚ฌ์šฉ์‹œ ์ฃผ์˜์‚ฌํ•ญ ๋ณธ๋ฌธ

๐Ÿ–ฅ BE ๋ฐฑ์—”๋“œ/Java ์ž๋ฐ”

[Java] Optional, Optional์˜ ๋ฉ”์„œ๋“œ, Optional ์‚ฌ์šฉ์‹œ ์ฃผ์˜์‚ฌํ•ญ

๋น„๋น„ bibi 2021. 4. 6. 00:15

Optional

Optional ์˜ต์…”๋„ : ''๊ฐ์ฒด''๊ฐ€ null์ธ์ง€ ์•„๋‹Œ์ง€ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

Optional<User> byId = userRepository.findById(id);

โ†“

User user = userRepository.findById(id).orElseGet(User::new);

  • ๋žŒ๋‹ค๋ฅผ ๋ฉ”์„œ๋“œ์ฐธ์กฐ๋กœ ๋ฐ”๊พธ๊ธฐ

    () -> new User() == User::new

    ๋žŒ๋‹ค์‹์„ ์ถ•์•ฝํ•œ ๋ฉ”์„œ๋“œ ์ฐธ์กฐ์‹?์ด๋‹ค.

  • orElseGet() : null์ผ ๋•Œ ()์•ˆ์„ ์‹คํ–‰ํ•œ๋‹ค. ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋žŒ๋‹ค์‹์„ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค

  • orElseThrow() : null์ผ ๋•Œ ํ•ด๋‹น ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค.

(๊ฒฐ๊ตญ Optional ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ญ์ƒ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋žŒ๋‹ค์‹ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.)

โ€ปOptional์— ๋Œ€ํ•œ ์ข‹์€ ๊ธ€ : ์ด๋…ธ ์ถ”์ฒœ

โ€ป. ์œผ๋กœ ๋ฉ”์„œ๋“œ์ฒด์ด๋‹์„ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์€ ๋Œ€๋ถ€๋ถ„ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.


๋ฏธ์…˜2 ํ”ผ๋“œ๋ฐฑ

Optional

Optional ์‚ฌ์šฉ๋ฒ•์€ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์—„์ฒญ ๋งŽ์ด ๋‚˜์˜ค๋Š”๋ฐ์š”~ ํ•˜๋‚˜๋งŒ ๊ฐ€์ ธ์™€ ๋ดค์Šต๋‹ˆ๋‹ค.
https://mangkyu.tistory.com/70

์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ํŒ์€ Optional ์ด ์–ด๋–ค ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ . ๋งŒ ์ฐ์–ด๋„ IDE์—์„œ ์ƒ์„ธํžˆ ์•Œ๋ ค์ค„ํ…๋ฐ ๋ฉ”์„œ๋“œ์˜ Input, Output ํƒ€์ž…์ด ์–ด๋–ค๊ฑด์ง€๋ฅผ ์ž˜ ์‚ดํŽด๋ณด๋ฉด ๋„์›€์ด ๋ ๊ฒ๋‹ˆ๋‹ค!

์ด๋…ธ ์ถ”์ฒœ ๋งํฌ

Optional ์—์„œ ๋ฐ”๋กœ get() ์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋„๋ก ํ•ด ์ฃผ์„ธ์š”

Optional ํƒ€์ž…์„ ๋ฐ›์•„์™”์œผ๋‹ˆ orElseThrow ๋“ฑ์œผ๋กœ ๊ฐ’์ด ์—†์„ ๋•Œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.^^
์ฒ˜์Œ์—๋Š” ์‚ฌ์šฉ๋ฒ•์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋Š”๋ฐ map, flatMap ๋“ฑ๋ณด๋‹ค๋Š”
orElseThrow, ifPresent ์ •๋„๋งŒ ์จ์„œ ์—†์„๋•Œ, ์žˆ์„๋•Œ ์ฒ˜๋ฆฌ๋งŒ ํ•ด๋ณด๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜์…จ์Œ ํ•˜๋„ค์š”~


[Optional] ๋ฉ”์„œ๋“œ

Optional ๋ฉ”์„œ๋“œ๋“ค ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌ.

  • get()

    • ๋น„์–ด ์žˆ๋Š” Optional ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•จ
  • empty()

    • Optional๊ฐ์ฒด๋ฅผ null๋กœ ์ดˆ๊ธฐํ™”ํ•จ
  • isPresent()

    • Optional ๊ฐ์ฒด์— ์ €์žฅ๋œ ๊ฐ’์ด null์ธ์ง€ ์•„๋‹Œ์ง€ ํ™•์ธํ•œ๋‹ค.
  • orElse()

    • ์ €์žฅ๋œ ๊ฐ’์ด ์กด์žฌํ•˜๋ฉด ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ
  • orElseGet()

    • ์ €์žฅ๋œ ๊ฐ’์ด ์กด์žฌํ•˜๋ฉด ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๋žŒ๋‹ค์‹ ๊ฒฐ๊ด๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ
  • orElseThrow()

    • ์ €์žฅ๋œ ๊ฐ’์ด ์กด์žฌํ•˜๋ฉด ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ด

Optional ์‚ฌ์šฉ ์‹œ ์œ ์˜์‚ฌํ•ญ

  1. isPresent()-get() ๋Œ€์‹  orElse()/orElseGet()/orElseThrow()

    • ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค
  2. orElse(new ...) ๋Œ€์‹  orElseGet(() -> new ...)

    • orElse(...)์—์„œ ...๋Š” Optional์— ๊ฐ’์ด ์žˆ๋“  ์—†๋“  ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋œ๋‹ค. ๋”ฐ๋ผ์„œ ...๊ฐ€ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” orElse() ๋Œ€์‹  orElseGet()์„ ์จ์•ผํ•œ๋‹ค.
  3. ๋‹จ์ˆœํžˆ ๊ฐ’/null๋งŒ ์–ป์„ ๋ชฉ์ ์ด๋ผ๋ฉด Optional ๋Œ€์‹  null๋น„๊ต(!=null)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  4. Optional ๋Œ€์‹  ๋น„์–ด์žˆ๋Š” ์ปฌ๋ ‰์…˜ ๋ฐ˜ํ™˜

  5. Optional์„ ํ•„๋“œ๋กœ ์‚ฌ์šฉ ๊ธˆ์ง€

  6. Optional์„ ์ƒ์„ฑ์ž๋‚˜ ๋ฉ”์„œ๋“œ ์ธ์ž๋กœ ์‚ฌ์šฉ ๊ธˆ์ง€

  7. Optional์„ ์ปฌ๋ ‰์…˜์˜ ์›์†Œ๋กœ ์‚ฌ์šฉ ๊ธˆ์ง€

  8. of(), ofNullable() ํ˜ผ๋™ ์ฃผ์˜

  9. Optional<T> ๋Œ€์‹  OptionalInt, OptionalLong, OptionalDouble