ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA 8 : Optional
    JAVA 2021. 3. 18. 00:22
    ๋ฐ˜์‘ํ˜•

     

     

    ๋ฉ”์†Œ๋“œ์—์„œ ์ž‘์—… ์ค‘ ๊ฐ’์„ ์ œ๋Œ€๋กœ ๋ฆฌํ„ดํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์–ด๋–ค๊ฒƒ์ด ์žˆ์„๊นŒ?

    • ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค. (๋น„์‹ธ๋‹ค, ์ŠคํƒํŠธ๋ ˆ์ด์Šค๋ฅผ ์ฐ์–ด๋‘๊ธฐ ๋•Œ๋ฌธ)
    • null์„ ๋ฆฌํ„ดํ•œ๋‹ค. (๋น„์šฉ ๋ฌธ์ œ๋Š” ์—†์ง€๋งŒ ๊ทธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ์ฃผ์˜ํ•ด์•ผ ํ•จ)

    null ์ฒ˜๋ฆฌ ์‹œ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ ๋‘ ๊ฐ€์ง€๋Š” 

    • ๋Ÿฐํƒ€์ž„ ์‹œ NPE(NullPointerException)๋ผ๋Š” ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ ,
    • NPE๋ฅผ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•ด ๋“ค์–ด๊ฐ„ null์ฒดํฌ ๋กœ์ง์ด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฐ๋‹ค๋Š” ์ ์ด๋‹ค. 

    ์ด๋ฅผ ์œ„ํ•ด Optional์ด ๋“ฑ์žฅํ–ˆ๋‹ค.


    Optional์ด๋ž€ ? 

     

    ์กด์žฌํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์•ˆ ํ•  ์ˆ˜๋„ ์žˆ๋Š” ๊ฐ์ฒด๋กœ null์ด ๋  ์ˆ˜๋„ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ์ผ์ข…์˜ ๋ž˜ํผ ํด๋ž˜์Šค์ด๋‹ค.

    null ์ฒดํฌ๋ฅผ ๊นœ๋นกํ–ˆ๊ฑฐ๋‚˜ null์„ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” NullPointerException ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ๊ฒจ๋‚ฌ๋‹ค.

    Optional์„ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ฝ”๋“œ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋นˆ ๊ฐ’์ผ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฑธ ์•Œ๋ ค์ฃผ๊ณ , ๋นˆ ๊ฐ’์ผ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

     

     

    ์ฃผ์˜์‚ฌํ•ญ

    • ๋ฌธ๋ฒ•์ ์œผ๋กœ ์ œํ•œ์€ ์—†์ง€๋งŒ, return ํƒ€์ž…์œผ๋กœ ์“ฐ๋Š” ๊ฒƒ๋งŒ์ด ๊ถŒ์žฅ ์‚ฌํ•ญ์ด๋‹ค.
    • ๋ฉ”์†Œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…, ๋งต์˜ ํ‚ค ํƒ€์ž…, ์ธ์Šคํ„ด์Šค ํ•„๋“œ ํƒ€์ž…์œผ๋กœ ์“ฐ์ง€ ๋ง์ž.
    • Optional์„ returnํ•˜๋Š” ๋ฉ”์†Œ๋“œ์—์„œ null์„ returnํ•˜์ง€ ๋ง์ž.
    • ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ํƒ€์ž…์šฉ Optional์€ ๋”ฐ๋กœ ์žˆ๋‹ค. (OptionalInt, OptionalLong..)
    • Collection, Map, Stream Array, Optional์€ Optional๋กœ ๊ฐ์‹ธ์ง€ ๋ง ๊ฒƒ.
      (์ด๊ฒƒ๋“ค์€ ๊ทธ ์ž์ฒด๋กœ ์ด๋ฏธ ๋น„์–ด์žˆ๋‹ค๋Š” ๊ฑธ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ์„ฑ๊ฒฉ์˜ ์ธ์Šคํ„ด์Šค๊ธฐ์— Optional๋กœ ๊ฐ์‹ธ๊ฒŒ ๋˜๋ฉด ๋‘๋ฒˆ ๊ฐ์‹ธ๊ฒŒ ๋˜๋ฏ€๋กœ ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†์Œ)

    Optional ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ

    Optional ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด ์ƒ์„ฑ์„ ์œ„ํ•ด ์„ธ๊ฐ€์ง€ ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

    • Optional.empty()
      null์„ ๋‹ด๊ณ ์žˆ๋Š”, ์ฆ‰ ๋น„์–ด์žˆ๋Š” Optioanl ๊ฐ์ฒด๋ฅผ ์–ป์–ด์˜จ๋‹ค. 
      ์ด ๋น„์–ด์žˆ๋Š” ๊ฐ์ฒด๋Š” Optional ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋†“์€ ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค์ด๋‹ค.

    • Optional.of(value)
      null์ด ์•„๋‹Œ ๊ฐ์ฒด๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” Optional ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
      null์ด ๋„˜์–ด์˜ฌ ๊ฒฝ์šฐ NPE๋ฅผ ๋˜์ง€๊ธฐ ๋•Œ๋ฌธ์— ์œ ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

    • Optional.ofNullable()
      null์ธ์ง€ ์•„๋‹Œ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” Optional ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
      null์ด ๋„˜์–ด์˜ฌ ๊ฒฝ์šฐ NPE๋ฅผ ๋˜์ง€์ง€ ์•Š๊ณ  Optional.empty()์™€ ๋™์ผํ•˜๊ฒŒ ๋น„์–ด์žˆ๋Š” Optional ๊ฐ์ฒด๋ฅผ ์–ป์–ด์˜จ๋‹ค.
      ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ null์ธ์ง€ ์•„๋‹Œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ๋Š” ์ด ๋ฉ”์†Œ๋ฅด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

    Optional์— ๊ฐ’์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ

    • isPresent()
      ๊ฐ์ฒด ์กด์žฌ ์—ฌ๋ถ€๋ฅผ boolํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.
    • isEmpty() (Java 11๋ถ€ํ„ฐ ์ œ๊ณต)

     

    Optional์— ์žˆ๋Š” ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
    Optional์ด ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ๋Š” ๋™์ผํ•˜๊ฒŒ ํ•ด๋‹น ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ,
    Optional์ด ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ(null์„ ๋‹ด๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ)์—๋Š” ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

    • get()
      ๋น„์–ด์žˆ๋Š” Optional ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ๋Š” NoSuchElementEsception์„ ๋˜์ง„๋‹ค.

    •  ifPresent(Consumer)
      Optional์— ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ๊ทธ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ~๋ฅผ ํ•˜๋ผ.
      ex) Spring์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ˆ˜์—…์ด ์žˆ์œผ๋ฉด id๋ฅผ ์ถœ๋ ฅํ•˜๋ผ.
    • orElse(T other)
      Optional์— ๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ฐ€์ ธ์˜ค๊ณ  ์—†๋Š” ๊ฒฝ์šฐ๋Š” ~๋ฅผ ๋ฆฌํ„ดํ•˜๋ผ.
       ex) JPA๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ˆ˜์—…์ด ์—†๋‹ค๋ฉด ๋น„์–ด์žˆ๋Š” ์ˆ˜์—…์„ ๋ฆฌํ„ดํ•˜๋ผ.

    • orElseGet(Supplier)
      Optional์— ๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ฐ€์ ธ์˜ค๊ณ  ์—†๋Š” ๊ฒฝ์šฐ์— ~~๋ฅผ ํ•˜๋ผ.
      ex) JPA๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ˆ˜์—…์ด ์—†๋‹ค๋ฉด ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ๋ฆฌํ„ดํ•˜๋ผ.

    • orElseThrow()
      Optional์— ๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ฐ€์ ธ์˜ค๊ณ  ์—†๋Š” ๊ฒฝ์šฐ ์—๋Ÿฌ๋ฅผ ๋˜์ ธ๋ผ.

    ** Optional ๋‹ต๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ

     

    ์ž๋ฐ”8 Optional 3๋ถ€: Optional์„ Optional๋‹ต๊ฒŒ

    Engineering Blog by Dale Seo

    www.daleseo.com

     

    Optional์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’ ๊ฑธ๋Ÿฌ๋‚ด๊ธฐ

    • Optional filter(Predicate)

     

    Optional์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’ ๋ณ€ํ™˜ํ•˜๊ธฐ

    • Optional map(Function)
    • Optional flatMap(Function)
      Optional
      ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ Optional์ธ ๊ฒฝ์šฐ์—  ์‚ฌ์šฉํ•˜๋ฉด ํŽธ๋ฆฌํ•˜๋‹ค.

    ์ฐธ๊ณ 

     

    Optional ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธฐ - Increment

    Optional์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์š” getter์— Optional์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€์ง€์— ๋Œ€ํ•ด, Java ์–ธ์–ด ์•„ํ‚คํ…ํŠธ์ธ Brian Goetz๊ฐ€ Stackoverflow์— ์ž‘์„ฑํ•œ ๋‹ต๋ณ€(๋งํฌ)์ž…๋‹ˆ๋‹ค. ๋‹น์—ฐํžˆ

    www.latera.kr

     

     
    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€

Designed by Tistory.