Swift: Optional๊ณผ Optional ์์ ํ๊ฒ ์ฌ์ฉํ๊ธฐ
๐ก ์ต์
๋ ์ฒด์ด๋ ๋ฑ ์ผ๋ถ ๋น ์ง ๊ฐ๋
์ ์ข ๋ ๊ณต๋ถํ๊ณ ์ ์ฑ์ธ ์์
๐ก ์ค์ํํธ์์๋ NULL์ nil๋ก ํ๊ธฐํ๋ค.
์ค์ํํธ๋ฅผ ์ฒ์ ์ ํ๋ฉด์ ๊ฐ์ฅ ๋จผ์ ๋ง๋๋ ์์ํ ๋ฌธ๋ฒ์ Optional
์ด ์๋๊น ์๊ฐํ๋ค. ์ฝํ๋ฆฐ์๋ Nullable
์ด๋ผ๋ ๊ฐ๋
์ด ์์ง๋ง ๋ด๊ฐ ์ฃผ๋ก ์ฌ์ฉํ๋ ์๋ฐ๋ ํ์ด์ฌ์๋ ์๋ ๋ฌธ๋ฒ์ด์๋ค. (Java8 ๋ถํฐ ๋์
๋์๋ค.)
์๋ฐ(ํน์ ๋ค๋ฅธ ์ธ์ด)์์ ์ฌ์ฉํ๋ ๊ฒ ์ฒ๋ผ ์ค์ํํธ์์ nil
์ ์ฌ์ฉํ๋ฉด Xcode
์์๋ ๋ฌด์ํ ๋นจ๊ฐ ์ค์ด ๋ฐ๊ธด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ณ ์น๊ธด ํด์ผ ํ๋๊น ์๋ฌธ๋ ๋ชจ๋ฅธ ์ฒด Fix๋ฅผ ๋๋ฌ์ ๊ณ ์น๋ค. ๋ค๋ค ์ด๋ฐ ๊ฒฝํ ํ๋ฒ์ฏค์ ์์ ๊ฑฐ๋ค.
์ํํ ์ง์๊ณผ, ์ข์ ์๋ฃ๋ค์ ์ฝ์ผ๋ฉด์ ์ ๋ฆฌํด๋ดค๋ค. ๋ชจ์ชผ๋ก ๋๊ตฐ๊ฐ์๊ฒ๋ ๋์์ด ๋๊ธธ ๋ฐ๋ผ๋ฉฐ, ์๋ชป๋ ์ง์์ ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
์ผ๋จ, Optional์ ๋ํด์ ์์๋ณด์.
The Swift Programming Language (Swift 5.3) ํ์ด์ง์์ Optional์ ์ด๋ ๊ฒ ์ค๋ช ํ๋ค.
You use optionals in situations where a value may be absent. An optional represents two possibilities: Either there is a value, and you can unwrap the optional to access that value, or there isn’t a value at all.
๊ฐ์ด ์์ ์ ์๋ ์ํฉ์์ ์ต์ ๋์ ์ฌ์ฉํฉ๋๋ค. ์ต์ ๋์ ๋๊ฐ์ง ๊ฐ๋ฅ์ฑ์ ๋ํ๋ธ๋ค: ๊ฐ์ด ์๊ณ ์ต์ ๋์ ํ์ด์ ํด๋น ๊ฐ์ ์ก์ธ์ค ํ ์ ์๊ฑฐ๋ ๊ฐ์ด ์ ํ ์๋ ๊ฒฝ์ฐ.
์ต์ ๋ ๋ณ์(๋๋ ์์)๋ฅผ ๋ง๋๋ ๋ฒ
Int
ํ ๋ณ์๋ฅผ ๋ง๋ ๋ค๊ณ ํด๋ณด์. ์ฐ๋ฆฌ๋ ๋ชจ์ข
์ ์ด์ ๋ก ๋ณ์๋ฅผ ์์ฑํ๊ณ ๋์ค์ ๊ฐ์ ์ด๊ธฐํํด์ฃผ๊ณ ์ถ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ์ํฉ์ ํ์ด์ฌ์ผ๋ก ์์ฑํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
num = None
num = 7
print(num) # 7
๋์ค์ ๋ฃ์ 7์ด ์ ์ถ๋ ฅ๋๋ ๊ฑธ ํ์ธํ ์ ์๋ค. ๋๊ฐ์ด ์ค์ํํธ๋ก ์์ฑํ๋ฉด ์ด๋จ๊น?
var num: Int = nil // ๐ 'nil' cannot initialize specified type 'Int'
num = 7
print(num)
์ค์ํํธ๋ nil
์ ๋ํด์ ์๊ฒฉํ ํธ์ด๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ํ์์ ๋ค๋ฅธ ์ธ์ด์์ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ๋ณ์ ์์ฑ ์ nil
์ ๋ฃ๊ณ ๋์ค์ ์ด๊ธฐํ ํ๋ ค๊ณ ํ๋ฉด Xcode
์์๋ 'nil' cannot initialize specified type 'Int'
์ด๋ผ๋ ๋ฌธ๊ตฌ์ ํจ๊ป ๋นจ๊ฐ ์ค์ด ๋ฌ๋ค.
์ ์ํฉ์ฒ๋ผ ์ผ๋ฐ ๋ณ์์ nil
์ ํ ๋นํ๋ ค๊ณ ํ๋ฉด, ์ปดํ์ผ ์ค๋ฅ๊ฐ ์ฐ๋ฆฌ๋ฅผ ๋ฐ๊ธด๋ค. ์ค์ํํธ์์๋ ์ต์
๋ ๋ณ์(์์)๊ฐ ์๋๋ฉด nil
์ ํ ๋นํ ์ ์๋ค.
์ต์
๋ ๋ณ์(์์)๋ฅผ ์์ฑํ๊ณ nil
์ ํ ๋นํด๋ณด์. ํ์
๋ค์ ?
๋ฅผ ๋ถ์ด๋ฉด ๋๋ค.
var num: Int? = nil
num = 7
print(num) // Optional(7)
num
๋ณ์์ 7์ ๋ฃ๊ณ ์ถ๋ ฅ์ ํด๋ณด๋ ์ถ๋ ฅ์ด ๋๊ธด ํ๋๋ฐ, ๋ญ๊ฐ ์ด์ํ๋ค. ๊ฐ์ด Optional()
๋ก ๊ฐ์ธ ์ ธ์ ์ถ๋ ฅ๋๋ค. ์ด์ , ์ต์
๋ ๊ฐ์ ๊ณผ์ผ ๊น๋ฏ ์๋งน์ด๋ง ๋ฝ์๋ด๋ ๋ฐฉ๋ฒ์ ์์๋ณด์.
๊ฐ์ ์ถ์ถ(Forced Unwrapping)
์ต์
๋ ๊ฐ์ ๊ฐ์ ๋ก ์ถ์ถํ๋ ค๋ฉด ์ต์
๋ ๊ฐ ๋ค์ !
๋ฅผ ๋ถ์ธ๋ค. ์ด ๋ฐฉ๋ฒ์ ํ์คํ์ง๋ง ์ํํ๋ค. ๋ฒ๊ฒจ๋ด๋ ค๋ ์ต์
๋์ด ๊ฐ์ด ์๋ค๋ฉด ๋ฌธ์ ๊ฐ ์๊ฒ ์ง๋ง, ๊ฐ์ด ์๋ ์ํฉ์ด๋ผ๋ฉด ์ค๋ฅ๊ฐ ์ฐ๋ฆฌ๋ฅผ ๋ฐ๊ธด๋ค.
var num: Int? = 7
if num != nil {
print("num is \(num!)") // num is 7
}
๊ฐ๊ธ์ ์ด๋ฉด ์ฌ์ฉํ์ง ์๊ณ , ํน์๋ผ๋ ์ฐ๊ฒ ๋๋ค๋ฉด ๋ฐ๋์ ๊ฐ์ด ์์์ ๋ณด์ฅํ๋ ์ํฉ์์๋ง ์ฐ์.
์ต์ ๋ ๋ฐ์ธ๋ฉ(Optional Binding) - if
์ต์
๋ ๋ฐ์ธ๋ฉ์ ์ต์
๋ ๋ณ์(์์)์ ๊ฐ์ด ์๋์ง ํ์ธํ๊ณ , ํด๋น ๊ฐ์ ์์ ๋ณ์(์์)์ ํ ๋นํด์ ์ฌ์ฉํ๋ ๊ธฐ๋ฒ์ด๋ค. if
๋ฌธ์ด๋ while
๋ฌธ๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ค.
func output(_ myName: String?) {
if let name = myName {
print("my name is \(name)")
} else {
print("unknown name")
}
}
var myName: String? = "์ง์"
output(myName) // my name is ์ง์
if
๋ฌธ์์ ์์ฑํ ์์ ์์ name
์ if
๋ฌธ ๋ด๋ถ์์๋ง ์ฌ์ฉํ ์ ์๋ค.
์์ ๊ฐ์ ์ํฉ์ guard
๋ฌธ์ ์ด์ฉํด์ ์ฒ๋ฆฌํ ์๋ ์๋ค.
์ต์ ๋ ๋ฐ์ธ๋ฉ(Optional Binding) - guard
guard
๋ฌธ์ ์๋ ์กฐ๊ฑด์ด false
์ธ ๊ฒฝ์ฐ์๋ guard
๋ฌธ ๋ด๋ถ๋ก ์ง์
ํ๊ณ , true
์ธ ๊ฒฝ์ฐ์๋ ๋ฐ๊นฅ ์ฝ๋๋ฅผ ์งํํ๋ค.
if
๋ฌธ์ผ๋ก ์์ฑํ ์์ ์์๋ if
๋ฌธ ๋ด๋ถ์์๋ง ์ฌ์ฉํ ์ ์์ง๋ง, guard
๋ฌธ์ผ๋ก ์์ฑํ ์์๋ guard
๊ตฌ๋ฌธ์ด ๋๋๊ณ ๋ ๋ค๋ถํฐ ํจ์ ๋ด๋ถ์ ์ง์ญ ์์์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
func output(_ name: String?) {
guard let name = myName else {
print("unknown name")
return
}
print("my name is \(name)")
}
var myName: String? = nil
output(myName) // unknown name
guard
๋ฌธ ๋ด๋ถ์ ๋์๋ return
, break
, continue
, throw
๊ฐ ํฌํจ๋์ด์ผ ํ๋ค.
Nil-Coalescing Operator - ??
?? ์ฐ์ฐ์๋
๊ฐ์ด ํฌํจ๋์ด ์๋ ๊ฒฝ์ฐ์๋ ์ต์
๋์ ๋ฒ๊ธด ๊ฐ์ ๋ฐํํ๊ณ , ์๋ ๊ฒฝ์ฐ์๋ default ๊ฐ์ ์ค์ ํด์ค ์ ์๋ค.
var myNickname: Int? = nil
let nickname = myNickname ?? "๋จน๊ตฌ๋ฆ"
print(nickname) // "๋จน๊ตฌ๋ฆ"
!!
Double exclamation !! mark in Swift? ์ด๋ผ๋ ์คํ์ค๋ฒํ๋ก์ฐ ๊ธ์ ๋ณด๋ฉด, Optional(Optional(value))
์ ๊ฐ์ด ์ด์ค์ผ๋ก ํฌ์ฅ๋์ด์๋ ์ํฉ์์ ์ฌ์ฉํ๋ ๊ฑฐ ๊ฐ์ง๋ง, ๋ ์์ธํ ์๋ฃ๋ ์ฐพ์ง ๋ชปํด์ ์ผ๋จ ์ด ๋ถ๋ถ์ ์ข ๋ ์ฐพ์๋ณด๋ ๊ฑธ๋ก....
์ฐธ๊ณ ์๋ฃ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote