-
[Swift] Optional - 1 (Forced Unwrapping, Optional Binding)Swift 2022. 2. 14. 23:56
(๋ชจ๋ ์ฝ๋๋ Playground์์ ์์ฑ๋์์ต๋๋ค.)
์ด๋ฒ ์๊ฐ์๋ Optional์ ๋ํด ๊ณต๋ถํด๋ณด๊ณ ์ ํ๋ค!
์ง๊ธ๊น์ง ๋ชจ๋ ์์์ ๋ณ์๋ค์ ๊ฐ์ ์ ์ธํ ํ ์ด๊ธฐํ๋ฅผ ํ์๋ค. ์ฆ, ๋ชจ๋ ๊ฐ์ด ์กด์ฌํ์๋ค.
์ด๋ ๊ฒ ๊ฐ์ด ์กด์ฌํ๋ ๊ฒ๋ค์ Non-Optional ์ด๋ผ๊ณ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด Swift์์ ๊ฐ์ ์ ์ฅํ์ง ์์ผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
๋ฐ๋ก Optional์ ์ฌ์ฉํ๋ฉด ๋๋ค.
Type?Optional์ ์๋ฃํ์ ํ์ ๋ค์ ?๋ฅผ ๋ถ์ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก, Optional์ด๋ผ๋ ์๋ฏธ ๊ทธ๋๋ก ๊ฐ์ ๊ฐ์ ธ๋ ๋๊ณ , ๊ฐ์ ๊ฐ์ง์ง ์์๋ ๋๋ค.
๊ฐ์ด ์์์ ํํํ๊ธฐ ์ํด์๋ nil์ด๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ ๊ณง ์๋ฌด๊ฒ๋ ์ ์ฅํ์ง ์๊ฒ ๋ค๋ ๊ฒ๊ณผ ๊ฐ๋ค.
let optionalVal: String? = nil์๋ ์ฝ๋๋ Non-Optional ์ด๊ธฐ ๋๋ฌธ์ ํญ์ ๊ฐ์ ๊ฐ์ ธ์ผํ๊ณ , nil์ ์ ์ฅํ ์ ์๋ค.

๋ฐ๋ฉด, ์๋ ์ฝ๋๋ Optional ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ ์ฅํ์ง ์์๋ ๋๊ณ , nil์ ์ ์ฅํ ์ ์๋ค.

nil์ ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ํ์ ์ถ๋ก ์ ํ ์ ์๋ค. ๋ฐ๋ผ์ nil์ ์ ์ฅํ ๋์๋ ๋ฐ๋์ Type Annotation (ํ์ ์ง์ )์ ๊ผญ ํด์ฃผ์ด์ผํ๋ค!
Optional ํ์ ์ ๊ฐ์ง optionalVal์ด๋ผ๋ ์์์ 1์ ์ ์ฅํ ํ์ 2๋ฅผ ๋ํด๋ณด์.
๊ทธ๋ฌ๋ฉด Optional ํ์ (Int?)์ ๋ฌด์กฐ๊ฑด Int๋ก unwrapped ๋์ด์ผํ๋ค๋ ๋ฉ์์ง๋ฅผ ํ์ธํ ์ ์๋ค.

์ด์ฒ๋ผ, Optional ํ์ ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ฐ๋์ ๊ฐ์ ์ถ์ถ (unwrapping)ํ๊ณ ์ฌ์ฉํด์ผํ๋ค.
๊ฐ์ ์ถ์ถํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ Forced Unwrapping๊ณผ Optional Binding์ด ์๋๋ฐ, ๋จผ์ Forced Unwrapping์ ๋ํด ์์๋ณด์.
1. Forced Unwrapping (๊ฐ์ ์ถ์ถ)
Forced Unwrapping (๊ฐ์ ์ถ์ถ)์ ๊ฐ์ ์ถ์ถ ์ฐ์ฐ์ (Forced Unwrapping Operator) !๋ฅผ Optional ํํ์ ๋ค์ ๋ถ์ฌ์ ์ฌ์ฉํ๋ค.
Optional ํํ์์ unwrappingํ๋ฉด Non-Optional ํ์ ์ผ๋ก ๊ฐ์ด ๋ฆฌํด๋๋ค.
์๋ ์์๋ฅผ ๋ณด์.

num์ Optional Int์ด๊ณ , ํ์ฌ nil ๊ฐ์ด ์ ์ฅ๋์ด์๋ค.
num์ 0์ ์ ์ฅํ ํ์ ์ด๋ฅผ ์ถ๋ ฅํ๋ฉด, ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ Optional(0)์ด๋ค.
num์ ๊ฐ์ ์ถ์ถํ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ Optional(0)์ด ์๋๋ผ 0์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ฐ์ ์ถ์ถ ๊ฒฐ๊ณผ์ ์๋ฃํ์ ๊ฐ์ ์ถ์ถ ์ ์ Optional์์ Optional์ ์ ์ธํ๊ณ ๊ฐ๋ค.
String?์ ์ถ์ถํ๋ฉด String์ด, Int?๋ฅผ ์ถ์ถํ๋ฉด Int๊ฐ, Double?์ ์ถ์ถํ๋ฉด Double๋ก ๊ฐ์ด ์ถ์ถ๋๋ค.
์๋ก์ด ๋ณ์ newNum์ ์์ ์ ์ฅํ๋ ๊ฐ num์ ์ ์ฅํ๊ณ ๊ฐ์ ์ถ์ถํ์ฌ ํ์ ์ ํ์ธํด๋ณด๋ฉด Int ํ์ธ ๊ฒ์ ํ์ธํ ์ ์๋๋ฐ, Int?๊ฐ Int๋ก ์ถ์ถ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.

๊ทธ๋ ๋ค๋ฉด, ๋ง์ฝ nil์ด ์ ์ฅ๋์ด์๋ ์ํ์์ ๊ฐ์ unwrapping ํ๋ ค๊ณ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?

๊ฐ์ nil์ด ์ ์ฅ๋์ด์๋ ์ํ์์ ๊ฐ์ ์ถ์ถ์ ์๋ํ๋ฉด crash๊ฐ ๋ฐ์ํ๋ค.
๋ฐ๋ผ์ Forced Unwrapping์ ํ ๋์๋ ๋ฐ๋์ ๊ฐ์ด ์ ์ฅ๋์ด์๋์ง ํ์ธํ๊ณ ์ฌ์ฉํด์ผํ๋ค.

๊ทธ๋ ๋ค๋ฉด, ๊ฐ์ ๋ ์์ ํ๊ฒ ์ถ์ถํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น?
๊ฐ์ ๋ ์์ ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก Optional Binding์ ์ฌ์ฉํ๋ค.
2. Optional Binding
Optional Binding์ Optional์ ์์ ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ฒ์ผ๋ก, Optional ํํ์์ ์ ์ฅ๋์ด ์๋ ๊ฐ์ ์ถ์ถํ์ฌ ์์์ ์ ์ฅํ๋ ๊ฒ์ด๋ค.
Optional ํํ์์ ํ๊ฐํ ํ์ ๊ทธ ๊ฐ์ด nil์ด๋ผ๋ฉด ๋ฐ์ธ๋ฉ์ ์คํจํ๊ณ , nil์ด ์๋๋ผ๋ฉด ๋ฐ์ธ๋ฉ์ ์ฑ๊ณตํ๋ค.
Optional Binding์ ์๋์ ๊ฐ์ด if, while, guard์์ ์ฌ์ฉ๋๋ค.
์ฌ๊ธฐ์ Type์ Optional ํํ์์ ์ํด ์ถ๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ตํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.

๋ฐ์ธ๋ฉ ์ฑ๊ณต ์ if ๋ฌธ์ if ๋ธ๋ก์ด, while ๋ฌธ์ ๋ฐ๋ณต๋ฌธ์ด, guard ๋ฌธ์ else ๋ธ๋ก ๋ค์์ ์ฝ๋๊ฐ ์คํ๋๋ค.
๋ฐ์ธ๋ฉ ์คํจ ์ if ๋ฌธ๊ณผ while ๋ฌธ์ ๋ค์ ๋ธ๋ก์ผ๋ก ์ ์ด๋ฅผ ๋๊ธฐ๊ณ , guard ๋ฌธ์ else ๋ธ๋ก์ ์คํํ๋ค.
์๋ ์์๋ฅผ ๋ณด์.

myMood์ ๊ฐ์ด mood์ ์ฑ๊ณต์ ์ผ๋ก ๋ฐ์ธ๋ฉ๋์๊ธฐ ๋๋ฌธ์ if ๋ฌธ ๋ธ๋ก์ด ์คํ๋๊ณ , "I am Happy"๋ผ๋ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
์๋์ ๊ฐ์ด ํ๋์ ๋ฌธ์ฅ์์ ๋ฐ์ธ๋ฉ์ ์ฌ๋ฌ ๊ฐ ํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.

'Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Function - 1 (Defining/Calling Function, Parameter, Argument Label) (0) 2022.02.15 [Swift] Optional - 2 (IUO, Nil-Coalescing, Optional Chaining) (0) 2022.02.14 [Swift] enumerated() (0) 2022.02.08 [Swift] ๋ณ์์ ์์ (Variables and Constants) (0) 2022.02.07 [Swift] ์ง์ ๋ณํ (0) 2022.02.02