suvera-dev ๐Ÿฅฆ

Swift ) ๊ธฐ์ดˆ ๋ฌธ๋ฒ• 5์ผ์ฐจ - UnWrap ์˜ต์…”๋„ ๋ณ€์ˆ˜ ๋ณธ๋ฌธ

Language/Swift

Swift ) ๊ธฐ์ดˆ ๋ฌธ๋ฒ• 5์ผ์ฐจ - UnWrap ์˜ต์…”๋„ ๋ณ€์ˆ˜

suvera 2022. 2. 7. 06:20

 

๐ŸŒ€ Optional ์ด๋ž€ ?

- ํƒ€์ž…์— ๊ฐ’์ด ์žˆ์„์ˆ˜๋„ ์—†์„์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ณ  ํƒ€์ž…๋’ค์— ?๋ฅผ ๋ถ™์—ฌ์„œ Optional ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- ๋ณ€์ˆ˜์˜ ๊ฐ’์ด nil ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ

 

Optional ๋ณ€์ˆ˜๋“ค์€ ๊ฐ’์ด Optional("—-") ํ˜•์‹์œผ๋กœ ํ‘œ์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์— value ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” unwrapping์„ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. unwrapํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋จผ์ € Force unwrapping์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ’ ๋’ค์— !๋ฅผ ๋ถ™์ด๋ฉด ๋˜๋Š”๋ฐ ์ด๋•Œ value๊ฐ€ nil์ธ ๊ฒฝ์šฐ์— force unwrapping์„ ์‹œ๋„ํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

 

 

๐ŸŒ€ Optional ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ? 

Optinal ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ Optional Binding ๊ณผ Optinal Chaining์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

- Optinal Binding์ด๋ž€ if let ๊ตฌ๋ฌธ์ด๋‚˜ guard let ๊ตฌ๋ฌธ์œผ๋กœ ๋ฏธ๋ฆฌ ๋ณ€์ˆ˜์— ๊ฐ’์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

Optinal ํ‘œํ˜„์‹์„ ํ‰๊ฐ€ํ•˜์—ฌ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด unwrapping ๋˜์–ด ์ƒ์ˆ˜์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ unwrapping ํ•˜์—ฌ crash ์œ„ํ—˜์ด ์—†์Šต๋‹ˆ๋‹ค.

 

- Optinal Chaining ์€ ํ•˜์œ„ property ์— optinal ๊ฐ’์ด ์žˆ๋Š”์ง€ ์—ฐ์†์ ์œผ๋กœ ํ™•์ธํ•˜๋ฉด์„œ nil ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด nil์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ Optional์ด๋ฉฐ ํ‘œํ˜„์‹ ์ค‘ ํ•˜๋‚˜๋ผ๋„ nil์„ ๋ฆฌํ„ดํ•  ๊ฒฝ์šฐ ์ด์–ด์ง€๋Š” ํ‘œํ˜„์‹์„ ํ‰๊ฐ€ํ•˜์ง€ ์•Š๊ณ  nil์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

 

// ์˜ต์…”๋„์ด๋ž€?
// ๊ฐ’์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค.
var someVariable : Int? = nil

if someVariable == nil {
    someVariable = 90
}

print("someVariable: ", someVariable)

// ์–ธ๋žฉํ•‘์ด๋ž€? ๋žฉ ์ฆ‰ ๊ฐ์‹ธ์ ธ์žˆ๋Š” ๊ฒƒ์„ ๋ฒ—๊ธฐ๋Š” ๊ฒƒ
if let otherVariable = someVariable {
    print("์–ธ๋ž˜ํ•‘ ๋˜์—ˆ๋‹ค. ์ฆ‰ ๊ฐ’์ด ์žˆ๋‹ค. otherVariable : \(otherVariable)")
} else {
    print("๊ฐ’์ด ์—†๋‹ค.")
}

someVariable = nil

// someVariable ์ด ๋น„์–ด์žˆ์œผ๋ฉด ์ฆ‰ ๊ฐ’์ด ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์š”๋†ˆ์„ ๋„ฃ๊ฒ ๋‹ค.
let myValue = someVariable ?? 10
print("myValue: \(myValue)")

var firstValue : Int? = 30
var secondValue : Int? = 50

print("firstValue: \(firstValue)")
print("secondValue: \(secondValue)")

unwrap(firstValue)
unwrap(secondValue)

func unwrap(_ parameter: Int?) {
    print("unwrap() called")
    // ๊ฐ’์ด ์—†์œผ๋ฉด ๋ฆฌํ„ด ํ•ด๋ฒ„๋ฆฐ๋‹ค.
    // ์ฆ‰ ์ง€๋‚˜๊ฐ„๋‹ค.
    guard let unWrappedParam = parameter else {
        return
    }
    print("unWrappedParam: \(unWrappedParam)")
}

 

 

Swift์—์„œ Optional์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” 3๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฒซ์งธ, Objc์™€ ๊ฐ์ฒด์™€ ์ƒํ˜ธ์ž‘์šฉ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž…๋‹ˆ๋‹ค. Objc์—์„œ๋Š” ์–ด๋–ค ๊ฐ์ฒด ์ฐธ์กฐ ๊ฐ’์ด๋“  nil์ด ๋  ์ˆ˜ ์žˆ์–ด Optional์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‘˜์งธ, Instance Property์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์—ฐ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ViewController์˜ ๊ฒฝ์šฐ init ์ดํ›„์— View๋ฅผ loadํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ด์ „๊นŒ์ง€๋Š” View๊ฐ€ Optionalํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์…‹์งธ, ๊ฐ’์ด ์—†์Œ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ Optinal์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ•์ œ๋˜์–ด Runtime์— nil์ด ์•ผ๊ธฐํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ์–ด ์•ˆ์ •์„ฑ์ด ์ฆ๊ฐ€ํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Comments