ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] Optional - 2 (IUO, Nil-Coalescing, Optional Chaining)
    Swift 2022. 2. 14. 23:57

    ์ง€๋‚œ ์‹œ๊ฐ„์— ์ด๋ฒˆ์—๋Š” IUO, Nil-Coalescing Operator, Optional Chaining์— ๋Œ€ํ•ด ์ฐจ๋ก€๋Œ€๋กœ ์‚ดํŽด๋ณด์ž.

     

     

    1. IUO (Implicitly Unwrapped Optionals)

    IUO๋Š” Implicitly Unwrapped Optionals์˜ ์ค„์ž„๋ง์œผ๋กœ, ํŠน์ • ์กฐ๊ฑด์—์„œ ์ž๋™์œผ๋กœ ์ถ”์ถœ๋˜๋Š” Optional์ด๋‹ค. 

    Type!

    ์ž๋ฃŒํ˜• ๋’ค์— !๋ฅผ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ฐ’์„ Non-Optional๋กœ ์ €์žฅํ•˜๋ฉด ์ž๋™์œผ๋กœ unwrapping์ด ๋œ๋‹ค.

     

     

    ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

    ์ƒ์ˆ˜ num์„ IUO๋กœ ์ €์žฅํ•˜๊ณ , ์ƒ์ˆ˜ a์˜ ๊ฐ’์„ num์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ์—ˆ๋‹ค.

    ์œ„์—์„œ ๊ณต๋ถ€ํ•œ ๋Œ€๋กœ๋ผ๋ฉด, IUO๋Š” ์ž๋™์œผ๋กœ ์ถ”์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์ˆ˜ a์˜ ํƒ€์ž…์€ Non-Optional Int์ด์–ด์•ผํ•œ๋‹ค.

    ํ•˜์ง€๋งŒ a์˜ ํƒ€์ž…์€ Optional Int์ด๋‹ค.

     

    IUO๋Š” Type Inference (ํ˜•์‹ ์ถ”๋ก )์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ž๋™์œผ๋กœ ์ถ”์ถœ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, 

    IUO์—์„œ ์ž๋™ ์ถ”์ถœ์„ ํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ Type Annotation (ํ˜•์‹ ์ง€์ •)์„ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

     

    ๊ทธ๋ž˜์„œ ์ง์ ‘ ํ˜•์‹์„ ์ง€์ •ํ•ด์ค€ b์˜ ํƒ€์ž…์€ Int์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    IUO๋„ Optional์ด๊ธด ํ•˜์ง€๋งŒ, Optional๊ณผ ๋‹ค๋ฅธ ์ ์€ ํŠน์ • ์กฐ๊ฑด์—์„œ ์ž๋™์œผ๋กœ ์ถ”์ถœ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

    ๋”ฐ๋ผ์„œ ๊ฐ’์ด ์ €์žฅ๋˜์–ด์žˆ๋‹ค๋ฉด !๋ฅผ ์ด์šฉํ•ด์„œ Force Unwrapping (๊ฐ•์ œ ์ถ”์ถœ)๋„ ํ•  ์ˆ˜ ์žˆ๊ณ , Optional Binding ๋˜ํ•œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, nil์ด ์ €์žฅ๋˜์–ด์žˆ๋‹ค๋ฉด ๊ฐ’์ด ์—†๋Š”๋ฐ ์ด๋ฅผ ์ถ”์ถœํ•˜๋ ค๊ณ  ํ•˜๊ธฐ ๋•Œ๋ฌธ์— crash๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

     

    iOS์—์„œ IUO๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋กœ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ ์•„์šธ๋ ›์„ ์—ฐ๊ฒฐํ•  ๋•Œ๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค ์ˆ˜ ์žˆ๋Š”๋ฐ,

    @IBOutlet weak var label1: UILabel!

    ์•„์šธ๋ ›๊ณผ ๊ฐ™์ด ์ค‘์š”ํ•œ ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์–ผ๋ฅธ ์ฐพ์•„์ค˜์•ผํ•˜๋ฏ€๋กœ, IUO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•œ๋‹ค.

     

    IUO๋Š” crash์˜ ์œ„ํ—˜์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

    ๊ฐ€๊ธ‰์ ์ด๋ฉด IUO๋ณด๋‹ค๋Š” Optional, Optional Binding์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

     

     

    2. Nil-Coalescing Operator

    Nil-Coalescing Operator๋Š” ์šฐ๋ฆฌ๋ง๋กœ ๋‹ ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ, ์ดํ•ญ ์—ฐ์‚ฐ์ž์ด๋‹ค.

    ๋ฌธ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    OptionalExpresssion ?? Expression

    ์™ผ์ชฝ์—๋Š” Optional ํ‘œํ˜„์‹์ด, ์˜ค๋ฅธ์ชฝ์—๋Š” Non-Optional ํ‘œํ˜„์‹์ด ์˜จ๋‹ค.

    ๊ทธ๋ฆฌ๊ณ  ๋‹ ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž ์–‘ ์˜†์— ์˜ค๋Š” ํ‘œํ˜„์‹์€ Optional์„ ์ œ์™ธํ•˜๊ณ  ์„œ๋กœ ๊ฐ™์€ ํ˜•์‹์ด์—ฌ์•ผํ•œ๋‹ค.

     

    ๋‹ ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž๋Š” ๋‹จ๋ฝ ํ‰๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ,

    ๋งŒ์•ฝ OptionalExpression์ด ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค๋ฉด, Expression์€ ํ‰๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

    ๋ฐ˜๋Œ€๋กœ OptionalExpression์ด ๊ฐ’์„ ๋ฆฌํ„ดํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, Expression์ด ํ‰๊ฐ€๋œ๋‹ค. ๋”ฐ๋ผ์„œ Expression์—๋Š” Side effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

     

     

    ์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋ฐ”์ธ๋”ฉ ์„ฑ๊ณต ์‹œ "Hello, I'm hee"๋ฅผ, ์‹คํŒจ ์‹œ "Bye"๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

     

    ๋‹ ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฐ’์ด ์ €์žฅ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ์™€ ๊ฐ’์„ ์ถ”์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

    ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋‹ ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด์„œ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ด๋ณด์ž.

    var str: String? = "Hello, I'm hee"
    
    print(str ?? "Bye")

    ๋จผ์ € str์„ ํ‰๊ฐ€ํ•˜๊ณ , str์ด ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค๋ฉด, "Hello, I'm hee"๊ฐ€ ์ถœ๋ ฅ์ด ๋œ๋‹ค.

    str์ด ๊ฐ’์„ ๋ฆฌํ„ดํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ nil์„ ๋ฆฌํ„ดํ•œ๋‹ค๋ฉด "Bye"๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

     

     

    3. Optional Chaining

    Optional Chaining์€ Optional ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ Optional์ด๋‹ค.

    Optional Chaining์— ํฌํ•จ๋œ ํ‘œํ˜„์‹ ์ค‘ ํ•˜๋‚˜๋ผ๋„ nil์„ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ์ด์–ด์ง€๋Š” ํ‘œํ˜„์‹์„ ํ‰๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ nil์„ ๋ฆฌํ„ดํ•œ๋‹ค. 

    Optional Chaining์œผ๋กœ ๋ฆฌํ„ด๋˜๋Š” ํƒ€์ž…์€ ํ‰๊ฐ€ ๊ฒฐ๊ณผ์— ์ƒ๊ด€ ์—†์ด ๋ฌด์กฐ๊ฑด ๋งˆ์ง€๋ง‰ ๋ฉค๋ฒ„์˜ ํƒ€์ž…์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค.

     

    ๋Œ“๊ธ€

Designed by Tistory.