λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“± Mobile/iOS

[iOS - Swift] μ˜΅μ…”λ„(Optional)에 λŒ€ν•˜μ—¬, μ˜΅μ…”λ„ μΆ”μΆœ, μ˜΅μ…”λ„ 바인딩(Optional Binding), μ˜΅μ…”λ„ 체이닝(Optional Chaining)

μ˜΅μ…”λ„(Optional) μ΄λž€?

μ˜΅μ…”λ„μ΄λž€ κ°’이 μžˆμ„ μˆ˜λ„ 있고, 없을 μˆ˜λ„ μžˆλŠ” 것이닀.

일반적인 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œλŠ” 값이 null 인 λ³€μˆ˜μ— μ ‘κ·Όν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλœλ‹€.

ν•˜μ§€λ§Œ, swiftμ—μ„œλŠ” μ˜΅μ…”λ„μ„ μ‚¬μš©ν•˜λ©΄ 값이 μ—†λŠ” λ³€μˆ˜μ— 접근해도 ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜μ§€ μ•ŠλŠ”λ‹€.

 

 

μ˜΅μ…”λ„(Optional) 을 μ‚¬μš©ν•˜λŠ” 이유

값이 μ—†λŠ” 데이터 곡간에 μ ‘κ·Όν•˜λ €κ³  ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

값을 μ΄ˆκΈ°ν™”ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬μ— 값이 μ €μž₯λ˜μ–΄ μžˆμ§€ μ•Šμ„ 것이닀. ν˜Ήμ€, ‘μ“°λ ˆκΈ° κ°’’이 μ €μž₯λ˜μ–΄ μžˆμ„ 것이닀.

μ½”λ“œλ‘œ κ°„λ‹¨ν•˜κ²Œ μ˜ˆμ‹œλ₯Ό 듀어보겠닀.

 

var name : String
print(name)

 

μœ„μ˜ μ˜ˆμ‹œλ₯Ό μ‹€ν–‰μ‹œμΌœλ³΄λ©΄ μ—λŸ¬κ°€ λ°œμƒν•  것이닀. μ™œλƒλ©΄ nameμ—λŠ” μ•„λ¬΄λŸ° 값이 μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€.

그럼 앱이 꺼지지 μ•Šκ²Œ ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Όλ κΉŒ?

 

 

μ˜΅μ…”λ„(Optional) νƒ€μž…

μ˜΅μ…”λ„ νƒ€μž…μ€ nilμ΄λΌλŠ” ν‚€μ›Œλ“œμ™€ ?λ₯Ό μ‚¬μš©ν•œλ‹€. 그리고 μ–Έλž˜ν•‘μ„ ν•˜κΈ° μœ„ν•΄ !λ₯Ό μ‚¬μš©ν•œλ‹€.

nil은 값이 μ—†μŒμ„ ν‘œν˜„ν•˜λŠ” ν‚€μ›Œλ“œμ΄λ‹€. μš°λ¦¬κ°€ Cμ–Έμ–΄μ—μ„œ null을 μ‚¬μš©ν–ˆλ˜ 것이 기얡이 λ‚œλ‹€λ©΄, λΉ„μŠ·ν•œ κ°œλ…μ΄λΌκ³  μƒκ°ν•˜λ©΄ λœλ‹€.

 

var name : String?
print(name) //nil

name = "Gahyun"
print(name) //Optional(Gahyun)

 

name에 “Gahyun”을 λ„£μ—ˆλŠ”λ° μ™œ 좜λ ₯을 ν•˜λ©΄ Optional(Gahyun)으둜 λ‚˜μ˜¬κΉŒ?

λ©”λͺ¨λ¦¬ 곡간에 값이 없을 λ•Œ μ ‘κ·Όν•˜λ €λ©΄ μ—λŸ¬κ°€ λ°œμƒν•˜λŠ”λ°, 이 λ•Œ λ©”λͺ¨λ¦¬ κ³΅κ°„μ—μ„œ μž„μ‹œλ‘œ Optional νƒ€μž…μœΌλ‘œ μ„ μ–Έν•˜μ—¬ μž„μ‹œκ°’μœΌλ‘œ nil을 λ‹΄μ•„ λ†“λŠ” 것이닀.

그럼 String μ΄λž‘ String?은 같은 νƒ€μž…μΈκ°€? μ•„λ‹ˆλ‹€. String은 λ¬Έμžμ—΄ νƒ€μž…μ΄κ³  String?은 μ˜΅μ…”λ„ λ¬Έμžμ—΄ νƒ€μž…μ΄λ‹€.

 

 

μ˜΅μ…”λ„(Optional) νƒ€μž… μΆ”μΆœ 방법 

  1. κ°•μ œ μΆ”μΆœ
  2. nil인지 μ•„λ‹Œμ§€ 확인 ν›„ κ°•μ œ μΆ”μΆœ
  3. if let 바인딩
  4. guard let 바인딩
  5. Nil - Coalescing
//1. κ°•μ œ μΆ”μΆœ
print(name!)

//2. nil인지 μ•„λ‹Œμ§€ 확인 ν›„ κ°•μ œ μΆ”μΆœ
if name != nil {
print(name!)
}

//3. if let 바인딩
if let name = optionalName {
print(name)
}

//4. guard let 바인딩
guard let name = optionalName else { return }
print(name)

//5. Nil - Coalescing
optionalName ?? "Gahyun"

 

 

μ˜΅μ…”λ„ 바인딩(Optional Binding)

μ—¬κΈ°μ„œ 쑰금 더 μžμ„Ένžˆ λ³Ό μ˜΅μ…”λ„ μΆ”μΆœ 방법은 μ˜΅μ…”λ„ 바인딩(if let, guard let)이닀.

μ˜΅μ…”λ„ 바인딩은 κ°•μ œλ‘œ μ˜΅μ…”λ„μ„ μ—¬λŠ” 방식이 μ•„λ‹ˆλΌ, μ•ˆμ „ν•˜κ²Œ 확인을 해보고 μ—¬λŠ” 방식이닀.

if letκ³Ό guard let을 μ‚¬μš©ν•΄μ„œ μ˜΅μ…”λ„ μΆ”μΆœμ„ ν•œλ‹€.

 

μ½”λ“œλ‘œ κ°„λ‹¨ν•˜κ²Œ μ˜ˆμ‹œλ₯Ό 듀어보겠닀.

 

class Snack {
    var name : String?
    var price : Int?

    func buy() {
        print("ꡬ맀가 μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. ")
    }
}

var popcorn : Snack? = Snack()  //Optional Snack νƒ€μž…μœΌλ‘œ popcorn μ„ μ–Έ
popcorn?.name = "caramel popcorn"   //μ˜΅μ…”λ„ νƒ€μž„μ˜ name에 μ ‘κ·Όν•˜κ³  μ‹ΆμœΌλ©΄ ? 을 λΆ™μ—¬μ•Ό 함
popcorn?.price = 1500   //μ˜΅μ…”λ„ νƒ€μž… μ ‘κ·Ό μ‹œ ? 을 λΆ™μž„

print(popcorn?.name)    //Optional("caramel popcorn")

 

Snackμ΄λΌλŠ” ν΄λž˜μŠ€μ— 과자 이름과 가격을 μ˜΅μ…”λ„ λ¬Έμžμ—΄ νƒ€μž…, μ˜΅μ…”λ„ μ •μˆ˜ νƒ€μž…μœΌλ‘œ μ„ μ–Έν–ˆλ‹€.

그리고, κ·Έ μ•ˆμ— ꡬ맀 ν•¨μˆ˜λ₯Ό λ„£μ–΄λ³΄μ•˜λ‹€.

popcorn은 Optional Snack νƒ€μž…μœΌλ‘œ μ„ μ–Έν–ˆκ³ , ? 을 μ‚¬μš©ν•΄μ„œ 이름과 가격에 μ ‘κ·Όν–ˆλ‹€.

좜λ ₯을 해보면 Optional()에 κ°μ‹Έμ Έμ„œ 좜λ ₯이 λœλ‹€.

 

 

κ°•μ œ μΆ”μΆœκ³Ό μ˜΅μ…”λ„ 바인딩을 μ‚¬μš©ν•΄μ„œ “caramel popcorn” 만 좜λ ₯λ˜λ„λ‘ 해보겠닀.

 

// κ°•μ œ μΆ”μΆœ 
print((popcorn?.name)!) 


// if let 바인딩
if let snackname = popcorn?.name {
    print(snackname)
}

// guard let 바인딩
guard let snackname = popcorn?.name else { return }
print(snackname)

 

μ„Έ 가지 경우 λͺ¨λ‘ “caramel popcorn”만 좜λ ₯이 될 것이닀.

 

 

if let  vs  guard let

두 가지 λͺ¨λ‘ μ˜΅μ…”λ„ λ°”μΈλ”©μ—μ„œ λŒ€ν‘œμ μœΌλ‘œ μ‚¬μš©λ˜λŠ” ꡬ문이닀. ν•˜μ§€λ§Œ 차이점이 μžˆλ‹€.

guard let은 μƒμˆ˜ μ•ˆμ— μ˜΅μ…”λ„ 값을 ν• λ‹Ήν•œλ‹€λ©΄ μ „μ—­λ³€μˆ˜λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. 즉, guard let ꡬ문 λ°–μ—μ„œλ„ μƒμˆ˜λ₯Ό 자유둭게 μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 것이닀.

λ°˜λ©΄μ—, if let은 ν• λ‹Ή μƒμˆ˜λ₯Ό if let ꡬ문 μ•ˆμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€. 

 

 

μ˜΅μ…”λ„ 체이닝 (Optional Chaining)

μ˜΅μ…”λ„ 체이닝은, ν•˜λ‚˜λΌλ„ nil을 return ν•œλ‹€λ©΄ λ°”λ‘œ nil을 return ν•œλ‹€.

. (dot)을 톡해 λ‚΄λΆ€ ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œμ— μ˜΅μ…”λ„ 값이 ν•˜λ‚˜λΌλ„ κ»΄ 있으면 κ·Έκ²ƒμ€ μ˜΅μ…”널 체이닝이닀. 

 

let age = gahyun?.info.age

 

μœ„μ˜ μ½”λ“œμ—μ„œ ageλŠ” Optional(age.type)이닀. 즉, μ˜΅μ…”λ„ μ²΄μ΄λ‹μ˜ 결과값은 νƒ€μž…μ˜ λ§ˆμ§€λ§‰ ν‘œν˜„μ‹μ˜ μ˜΅μ…”λ„ νƒ€μž…μΈ 것이닀. 

 

 

 

728x90