๐—ถ๐—ข๐—ฆ/๐Ÿ iOS ๊ฐœ๋…ํŽธ

[iOS / Swift] Optional์ด๋ž€?

z_ero 2025. 10. 16. 18:31

Optional์ด๋ž€?

Optional์€ ๋ณ€์ˆ˜์— ๊ฐ’์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ  ์—†์„ ์ˆ˜๋„(nil) ์žˆ๋‹ค๋Š” ๊ฑธ ๋‚˜ํƒ€๋‚ด๋Š” ํƒ€์ž…์ด์—์š”.

์ฆ‰, “์ด ๋ณ€์ˆ˜๋Š” ์•„์ง ๊ฐ’์ด ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค”๋Š” ๊ฑธ Swift์—๊ฒŒ ๋ฏธ๋ฆฌ ์•Œ๋ ค์ฃผ๋Š” ๊ฑฐ์ฃ .

์ด๋ ‡๊ฒŒ nil์„ ๋Œ€์ž…ํ•˜๋ ค๊ณ  ํ•ด๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ์š”.

 

var name: String? = nil
name = "์˜๋Œ์ฟค"

์ด๋•Œ ?๋ฅผ ๋ถ™์—ฌ ์„ ์–ธํ•ด์•ผ nil์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์ฒ˜์Œ ์˜ต์…”๋„์„ ๋ฐฐ์šธ ๋•Œ ์Šˆ๋ขฐ๋”ฉ๊ฑฐ์˜ ๊ณ ์–‘์ด๋ผ๋Š” ๋น„์œ ๋ฅผ ๋“ค์—ˆ๋Š”๋ฐ ๊ณต๊ฐ์ด ๊ฐ€๋”๋ผ๊ตฌ์š”.

 

๊ทธ๋Ÿฐ๋ฐ ์ด๊ฑธ ๊ทธ๋ƒฅ print ํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋‚˜์˜ต๋‹ˆ๋‹ค.

Optional("์˜๋Œ์ฟค")

์ด๋Œ€๋กœ๋Š” ์“ธ ์ˆ˜ ์—†๊ฒ ์ฃ ! ๊ทธ๋ž˜์„œ ์˜ต์…”๋„์€ ‘๊ฐ’์„ ๊บผ๋‚ด๋Š” ๊ณผ์ •(์–ธ๋ž˜ํ•‘)’์ด ๊ผญ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

1. ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘ (Forced Unwrapping)

var name: String? = "์˜๋Œ์ฟค"
print(name!) // "์˜๋Œ์ฟค"

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

์ด๋•Œ ๊ฐ’์ด nil์ด๋ฉด ์•ฑ์ด ๋ฐ”๋กœ ์ฃฝ๋Š”๋ฐ์š”…

 

name = nil
// print(name!)  // ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ: Unexpectedly found nil...

์ฆ‰, ์›ฌ๋งŒํ•˜๋ฉด ์“ฐ์ง€ ์•Š๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค!

 

2. ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ (Optional Binding)

Optional์ด nil์ธ์ง€ ํ™•์ธํ•œ ๋‹ค์Œ, ๊ฐ’์ด ์žˆ์œผ๋ฉด ๊บผ๋‚ด์„œ ์ƒˆ๋กœ์šด ์ƒ์ˆ˜๋‚˜ ๋ณ€์ˆ˜์— ๋‹ด๋Š” ๋ฐฉ์‹์ด์—์š”.

๊ทธ๋Ÿฌ๋‹ˆ ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘๋ณด๋‹ค ํ›จ์”ฌ ์•ˆ์ „ํ•˜๊ฒ ์ฃ ?

if let

var nickname: String? = "zero"

if let nick = nickname {
    print("๋‹‰๋„ค์ž„์€ \\(nick)์ž…๋‹ˆ๋‹ค.")
} else {
    print("๋‹‰๋„ค์ž„์ด ์—†์Šต๋‹ˆ๋‹ค.")
}

๊ฐ’์ด ์—†์œผ๋ฉด else ๋ธ”๋ก์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. if๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํŒจํ•ด๋„ ์•ฑ์ด ์ฃฝ์ง€ ์•Š์•„์š”.

guard let

func greet() {
    guard let nick = nickname else {
        print("๋‹‰๋„ค์ž„์ด ์—†์Šต๋‹ˆ๋‹ค.")
        return
    }
    print("์•ˆ๋…•ํ•˜์„ธ์š”, \\(nick)๋‹˜!")
}

guard let์€ ํ•จ์ˆ˜ ์ดˆ๋ฐ˜์— ์ž์ฃผ ์”๋‹ˆ๋‹ค. ๊ฐ’์ด ์—†์œผ๋ฉด return์œผ๋กœ ์กฐ๊ธฐ ์ข…๋ฃŒํ•˜๊ณ , ์žˆ์œผ๋ฉด ์ดํ›„ ์ฝ”๋“œ๋ฅผ ๊ณ„์† ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

3. ์˜ต์…”๋„ ์ฒด์ด๋‹ (Optional Chaining)

@objc
private func nextButtonDidTap() {
    let viewController = NextViewController()
    navigationController?.pushViewController(viewController, animated: true)
}

์—ฌ๊ธฐ์„œ navigationController๊ฐ€ nil์ด๋ผ๋ฉด?

์•ฑ์ด ์ฃฝ์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๊ฐ€ ๋ฐ”๋กœ ?. ๋•๋ถ„์ธ๋ฐ์š”.

Optional Chaining์€ ๊ฐ’์ด ์žˆ์„ ๋•Œ๋งŒ ๋™์ž‘ํ•˜๊ณ , ์—†์œผ๋ฉด ์กฐ์šฉํžˆ ๋ฌด์‹œํ•˜๊ณ  ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค!

 

4. Nil ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž (Nil-Coalescing Operator)

์˜ต์…”๋„์ด nil์ผ ๋•Œ ๊ธฐ๋ณธ๊ฐ’์„ ์ฃผ๊ณ  ์‹ถ์„ ๋•Œ ??๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

var userName: String? = nil
let displayName = userName ?? "์ œ๋กœ"
print(displayName) // "์ œ๋กœ"

๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ทธ๋Œ€๋กœ, ์—†์œผ๋ฉด "์ œ๋กœ"๊ฐ€ ๋Œ€์‹  ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

UI์—์„œ “~์ด ์—†์œผ๋ฉด ๊ธฐ๋ณธ ๋ฌธ๊ตฌ ํ‘œ์‹œํ•˜๊ธฐ” ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•ด์š”.

๋ฐ˜์‘ํ˜•