λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
3️⃣ Swift/Swift 정리

[Swift] μ˜΅μ…”λ„ μΆ”μΆœ (κ°•μ œ μΆ”μΆœ, μ˜΅μ…”λ„ 바인딩, μ˜΅μ…”λ„ 체이닝) 정리

by seolhee2750 2021. 6. 12.

λ‚΄ λΈ”λ‘œκ·Έ 첫 κΈ€λ‘œ μ˜΅μ…”λ„μ— λŒ€ν•œ λ‚΄μš©μ„ μ—…λ‘œλ“œν–ˆμ—ˆλ‹€.

κ·Έλ•Œ μ†Œκ°œν•˜κΈ°λ₯Ό, λ‚΄κ°€ μŠ€μœ„ν”„νŠΈμ— λŒ€ν•΄ κ³΅λΆ€ν•˜λ‹€λ³΄λ‹ˆ ?와 !λ₯Ό μ ‘ν•˜κ²Œ λ˜μ—ˆλ‹€κ³  ν–ˆλ˜ κΈ°μ–΅,,

κ·Έ 날은 ?에 λŒ€ν•΄μ„œ μ†Œκ°œλ₯Ό ν–ˆλ‹€λ©΄ 그에 이어 μ˜€λŠ˜μ€ !에 λŒ€ν•΄ μ„€λͺ…해보렀고 ν•œλ‹€.

μ˜΅μ…”λ„μΈ 값을 μ˜΅μ…”λ„μ΄ μ•„λ‹Œ κ°’μœΌλ‘œ μΆ”μΆœν•΄μ£ΌλŠ” 방법듀을 μ •λ¦¬ν•΄λ³΄μž!

(μ˜΅μ…”λ„μ— λŒ€ν•΄ λͺ¨λ₯΄μ‹œλŠ” 뢄이라면 μ—¬κΈ°πŸ‘‡λ₯Ό μ°Έκ³ ν•΄μ£Όμ„Έμš”!)

2021.06.06 - [πŸ“ Swift Note/πŸ“‹ Concept Summary] - [Swift] Optional(μ˜΅μ…”λ„) 정리

 

[Swift] Optional(μ˜΅μ…”λ„) 정리

μŠ€μœ„ν”„νŠΈ 곡뢀λ₯Ό ν•˜λ‹€ λ³΄λ‹ˆ ?, 그리고 ! 이런 λ¬Έμž₯ λΆ€ν˜Έλ“€μ΄ λ“±μž₯ν•œλ‹€. μ˜€λŠ˜μ€ κ·Έ 쀑 ?에 λŒ€ν•΄ λ¨Όμ € μ„€λͺ…ν•΄ 보렀 ν•œλ‹€. πŸ“Ž μ˜΅μ…”λ„ μŠ€μœ„ν”„νŠΈκ°€ κ°€μ§€λŠ” λŒ€ν‘œμ μΈ νŠΉμ§•μœΌλ‘œ μ•ˆμ „μ„±μ΄ μžˆλ‹€. μ˜΅μ…”λ„μ€

seolhee2750.tistory.com

 

πŸ“Ž μ˜΅μ…”λ„ μΆ”μΆœ (Optional Unwrapping)

μ˜΅μ…”λ„ μΆ”μΆœμ€ 말 κ·ΈλŒ€λ‘œ μ˜΅μ…”λ„μΈ 값을 μ˜΅μ…”λ„μ΄ μ•„λ‹Œ κ°’μœΌλ‘œ μΆ”μΆœν•΄μ£ΌλŠ” 것을 λœ»ν•œλ‹€.

μŠ€μœ„ν”„νŠΈλŠ” μ˜΅μ…”λ„ νƒ€μž…κ³Ό λ…Ό μ˜΅μ…”λ„ νƒ€μž…μ„ μ² μ €νžˆ κ΅¬λΆ„ν•˜μ—¬ μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ—,

λ…Ό μ˜΅μ…”λ„ νƒ€μž…μ΄ ν•„μš”ν•  λ•ŒλŠ” κΌ­ μ˜΅μ…”λ„ μΆ”μΆœ 과정이 ν•„μš”ν•˜λ‹€.

 

이 μ˜΅μ…”λ„ μΆ”μΆœμ€ λ‹¨μˆœνžˆ μ΄ν•΄ν•˜λ©΄ κ·Έμ € 'μ˜΅μ…”λ„ -> λ…Ό μ˜΅μ…”λ„' κ³Όμ •μ΄μ§€λ§Œ

μ •ν™•νžˆ μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” Unwrappingμ΄λΌλŠ” ν‚€μ›Œλ“œμ— μ΄ˆμ μ„ λ§žμΆ°μ•Ό ν•œλ‹€.

μ•„λž˜μ— μ˜΅μ…”λ„κ³Ό μ˜΅μ…”λ„ μΆ”μΆœμ„ μ‰½κ²Œ 이해할 수 μžˆλ„λ‘ κ°„λ‹¨νžˆ 그림을 κ·Έλ Έλ‹€.

μ˜΅μ…”λ„, μ˜΅μ…”λ„ μΆ”μΆœ

이 그림을 보면, Int!둜 μ˜΅μ…”λ„ ν–ˆμ„ λ•Œ 값이 wrapping,
그리고 λ‹€μ‹œ wrapping된 것을 벗겼을 λ•Œ unwrappingλ˜λŠ” 것을 확인 κ°€λŠ₯ν•˜λ‹€.

πŸ‘‰ wrapping이 λ°”λ‘œ μ˜΅μ…”λ„, unwrapping이 μ˜΅μ…”λ„ μΆ”μΆœμ„ μ˜λ―Έν•˜λŠ” 것이닀.

 

μ΄λ ‡κ²Œ μ˜΅μ…”λ„μ€ λ‹¨μˆœνžˆ nil을 넣을 수 있게 λ°”κΏ”μ€€λ‹€! λ³΄λ‹€λŠ”

nilκΉŒμ§€ 담을 수 있게 감싸쀀닀.λΌλŠ” ν‘œν˜„μ΄ μ •ν™•ν•˜λ‹€.

πŸ‘‰ λ”°λΌμ„œ μ˜΅μ…”λ„ μΆ”μΆœμ€, 이 감싸놓은 μ˜΅μ…”λ„ 값을 λ‹€μ‹œ κΊΌλ‚΄λŠ” 과정이닀.!!

 

μ΄λ ‡κ²Œ μ •ν™•νžˆ 이해해 λ†“μœΌλ©΄, 이제 곡뢀할 κ°•μ œ μΆ”μΆœκ³Ό μ˜΅μ…”λ„ 바인딩, 체이닝을 μ’€ 더 μ‰½κ²Œ 곡뢀할 수 μžˆμ„ 것이닀.


πŸ“Ž κ°•μ œ μΆ”μΆœ (Forced Unwapping)

κ°•μ œ μΆ”μΆœμ€ μ˜΅μ…”λ„μ˜ 값을 μΆ”μΆœν•˜λŠ” κ°€μž₯ κ°„λ‹¨ν•œ 방법이닀.

μ•„λž˜μ— κ°•μ œμΆ”μΆœμ˜ κ°„λ‹¨ν•œ μ˜ˆμ‹œλ₯Ό μž‘μ„±ν–ˆλ‹€.

var num1: Int? = 1
var num2: Int = num1!

print(num1, num2)
// Optional(1) 1

num2의 경우 μ˜΅μ…”λ„μ΄ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— μ˜΅μ…”λ„ νƒ€μž…μΈ num1의 값을 μ €μž₯ν•  수 μ—†λ‹€.

λ”°λΌμ„œ num1 뒀에 !λ₯Ό λΆ™μ—¬μ„œ κ°•μ œμΆ”μΆœν•˜μ—¬ 값을 ν• λ‹Ήν•΄μ£Όμ—ˆλ‹€.

 

μ΄λ ‡κ²Œ κ°•μ œμΆ”μΆœμ˜ κ²½μš°μ—λŠ” ! ν•˜λ‚˜λ‘œ μ‰½κ²Œ μ˜΅μ…”λ„ μΆ”μΆœμ„ ν•  수 μžˆμ§€λ§Œ, κ°•μ œ μΆ”μΆœ λ°©μ‹μ˜ μ‚¬μš©μ€ μ§€μ–‘ν•˜λŠ” 것이 μ’‹λ‹€.

κ°•μ œμΆ”μΆœμ€ μ˜΅μ…”λ„ μΆ”μΆœμ„ ν•˜λŠ” κ°€μž₯ κ°„λ‹¨ν•œ 방법인 λ™μ‹œμ— κ°€μž₯ μœ„ν—˜ν•œ 방법이기 λ•Œλ¬Έμ΄λ‹€.

 

κ·Έ 이유λ₯Ό μœ„μ—μ„œ 봀던 그림을 가져와 λ‹€μ‹œ μƒκ°ν•΄λ³΄μž.

κ°•μ œ μΆ”μΆœ

κ°•μ œ μΆ”μΆœμ€ μ•ˆμ— 값이 μžˆλŠ”μ§€, μ—†λŠ”μ§€λ„ ν™•μΈν•˜μ§€ μ•Šκ³  κ·Έλƒ₯ κ°•μ œλ‘œ 값을 κΊΌλ‚΄μ˜€λŠ” 방법이기 λ•Œλ¬Έμ—

값을 κΊΌλƒˆμ„ λ•Œ μ•ˆμ— μ‹€μ œ 값이 μ‘΄μž¬ν–ˆλ‹€λ©΄ λ‹€ν–‰μ΄μ§€λ§Œ,

κΊΌλƒˆλŠ”λ° 값이 μ—†λ‹€λ©΄(nil 이라면) λ°”λ‘œ λŸ°νƒ€μž„ 였λ₯˜κ°€ λ°œμƒν•˜κ²Œ λœλ‹€.

 

μ•„λž˜λŠ” 잘λͺ»λœ κ°•μ œμΆ”μΆœμ΄ μ§„ν–‰λ˜μ—ˆμ„ λ•Œ 였λ₯˜κ°€ λ°œμƒν•˜λŠ” 상황을 μΊ‘μ²˜ν•œ λ‚΄μš©μ΄λ‹€.

κ°•μ œ μΆ”μΆœ λŸ°νƒ€μž„ 였λ₯˜

μœ„μ˜ μ½”λ“œμ—μ„œλŠ” μ˜΅μ…”λ„μΈ a에 nil을 ν• λ‹Ήν–ˆκ³ , μ˜΅μ…”λ„μ΄ μ•„λ‹Œ bλ³€μˆ˜μ— nil값이 μ €μž₯된 aλ₯Ό κ°•μ œμΆ”μΆœν•˜μ—¬ μ €μž₯ν–ˆλ‹€.

μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 값인 nil에 접근을 μ‹œλ„ν•˜λ‹ˆ

Fetal error: Unexpectedly found nil while unwrapping an Optional valueλΌλŠ” 였λ₯˜λ₯Ό λ³Ό 수 μžˆλ‹€.

 

πŸ‘‰ μ΄λ ‡κ²Œ κ°•μ œμΆ”μΆœμ€ λŸ°νƒ€μž„ 였λ₯˜μ˜ κ°€λŠ₯성을 μ–Έμ œλ‚˜ κ°–κ³ μžˆκΈ° λ•Œλ¬Έμ— μ§€μ–‘ν•˜λŠ” 것이 μ’‹κ³ ,

λ‘œμ§μƒ nil λ•Œλ¬Έμ— 였λ₯˜κ°€ λ°œμƒν•  κ°€λŠ₯성이 100% μ—†λ‹€κ³  νŒλ‹¨λ  λ•Œλ§Œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. 

(ν•˜μ§€λ§Œ μ‹€μ œ ν”„λ‘œμ νŠΈμš© ν”„λ‘œκ·Έλž˜λ° μ€‘μ—λŠ” 그럴 일이 λ“œλ¬Όλ‹€.)

 

그럼 보닀 μ•ˆμ „ν•˜κ²Œ μ˜΅μ…”λ„ μΆ”μΆœν•˜λŠ” 방법을 ν•œ 번 μ•Œμ•„λ³΄μž.

μ•ˆμ „ν•œ μΆ”μΆœ λ°©λ²•μœΌλ‘œλŠ” μ˜΅μ…”λ„ 바인딩과 μ˜΅μ…”λ„ 체이닝 μ΄λ ‡κ²Œ 두 가지 방식이 μžˆλ‹€.


πŸ“Ž μ˜΅μ…”λ„ 바인딩 (Optional Binding)

μ˜΅μ…”λ„ 바인딩은 μΆ”μΆœν•˜λ €λŠ” 값이 nil인지 λ¨Όμ € ν™•μΈν•˜κ³  μΆ”μΆœν•˜λŠ” 방식이닀.

μ˜΅μ…”λ„ 바인딩은 보톡 if λ˜λŠ” while ꡬ문 λ“±κ³Ό κ²°ν•©ν•˜μ—¬ μ‚¬μš©ν•œλ‹€.

 

μ•„λž˜μ— κ°„λ‹¨νžˆ μ˜΅μ…”λ„ 바인딩을 확인할 수 μžˆλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλ‹€.

var num: Int? = nil

if var number = num {
    number = 2
    print(number)
}
else {
    print("num is nil")
}

// num is nil

보톡 if문에 varλ₯Ό μ‚¬μš©ν•  수 μ—†μ§€λ§Œ, μ˜΅μ…”λ„ λ°”μΈλ”©μ—μ„œλŠ” if var ν˜Ήμ€ if let을 μ‚¬μš©ν•  수 μžˆλ‹€.

μœ„μ˜ if var number = num의 μ˜λ―ΈλŠ”

'λ§Œμ•½ μ˜΅μ…”λ„μ΄ μ•„λ‹Œ number λ³€μˆ˜μ— μ˜΅μ…”λ„μΈ num 값을 ν• λ‹Ή ν•  수 있으면'μ΄λΌλŠ” λœ»μ„ 가진닀고 μƒκ°ν•˜λ©΄ 쉽닀.

λ”°λΌμ„œ μœ„μ˜ μ½”λ“œλ₯Ό 보면, num 값에 ν˜„μž¬ nil이 μ €μž₯λ˜μ–΄ μžˆμœΌλ―€λ‘œ else에 ν•΄λ‹Ήν•˜λŠ” λ™μž‘μ„ μˆ˜ν–‰ν–ˆλ‹€.

λ§Œμ•½ 값이 μ‘΄μž¬ν–ˆλ‹€λ©΄ μ˜΅μ…”λ„μ—μ„œ μΆ”μΆœν•œ 값을 μƒμˆ˜λ‚˜ λ³€μˆ˜λ‘œ ν• λ‹Ήν•˜μ—¬ μ˜΅μ…”λ„μ΄ μ•„λ‹Œ ν˜•νƒœλ‘œ μ‚¬μš©ν•  수 있게 ν•΄μ€€λ‹€.


πŸ“Ž μ˜΅μ…”λ„ 체이닝 (Optional Chaining)

μ˜΅μ…”λ„ 체이닝은 μ΄λ¦„μ—μ„œλΆ€ν„° λŠκ»΄μ§€λ“―,

μ˜΅μ…”λ„μ„ λ°˜λ³΅μ‚¬μš©ν•˜μ—¬ μ˜΅μ…”λ„μ΄ 체인처럼 꼬리에 꼬리λ₯Ό λ¬Όκ³  μžˆλŠ” λͺ¨μ–‘이닀.

체인처럼 μ„œλ‘œκ°€ μ΄μ–΄μ ΈμžˆκΈ° λ•Œλ¬Έμ— 쀑간에 ν•˜λ‚˜λΌλ„ 값이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ (nil이면) λ°”λ‘œ nil을 λ°˜ν™˜ν•œλ‹€.

 

이에 λŒ€ν•œ λ‚΄μš©μ„ λ°”λ‘œ μ½”λ“œλ‘œ μ‚΄νŽ΄λ³΄μž.

class Person {
    var name: String
    var info: Info?
    
    init(name: String) {
        self.name = name
    }
}

class Info {
    var phoneNum: Int
    var adress: Adress?
    
    init(phoneNum: Int) {
        self.phoneNum = phoneNum
    }
}

class Adress {
    var city: String
    var street: String?
    
    init(city: String) {
        self.city = city
    }
}

let seolhee: Person = Person(name: "seolhee")

// μ˜΅μ…”λ„ 체이닝을 ν†΅ν•œ μΆ”μΆœ
let seolheeInfo: String? = seolhee.info?.adress?.street
// nil

μœ„μ˜ μ½”λ“œ 맨 λ§ˆμ§€λ§‰ μ€„μ—μ„œ ν”„λ‘œνΌν‹°λ₯Ό 톡해 체인처럼 μ΄μ–΄μ ΈμžˆλŠ” μ˜΅μ…”λ„ 체이닝을 확인할 수 μžˆλ‹€.

μ˜΅μ…”λ„ 체이닝은 λ³΄λ‹€μ‹œν”Ό infoλΆ€ν„° μ°¨λ‘€λŒ€λ‘œ nil값인지 μ•„λ‹Œμ§€λ₯Ό κ²€μ‚¬ν•˜μ—¬ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€.

nil이 λ°˜ν™˜λ  μˆ˜λ„ μžˆλ‹€λŠ” 점을 κ³ λ €ν•΄ ν”„λ‘œνΌν‹°λ§ˆλ‹€ ?λ₯Ό λΆ™μ—¬μ£Όμ—ˆλ‹€.

 

λΉ λ₯Έ 이해λ₯Ό μœ„ν•΄ μ•„λž˜μ— κ°„λ‹¨νžˆ μœ„ μ½”λ“œμ˜ μ˜΅μ…”λ„ 체이닝 진행 λ°©ν–₯을 κ·Έλ Έλ‹€.

μ½”λ“œμ˜ μ˜΅μ…”λ„ 체이닝 진행 μ„€λͺ…

λ¨Όμ € seolhee의 infoκ°€ nil인지 κ²€μ‚¬ν•˜λŠ”λ°, ν˜„μž¬ info λ³€μˆ˜μ—λŠ” 아무 값도 μ €μž₯λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ—

κ·Έ λ’€λ₯Ό 검사할 ν•„μš” 없이 λ°”λ‘œ nil을 λ°˜ν™˜ν•˜λŠ” λͺ¨μŠ΅μ„ λ³Ό 수 μžˆλ‹€.

 

πŸ‘‰ μ—¬κΈ°μ„œ μƒˆλ‘­κ²Œ μ•Œ 수 μžˆλŠ” 정보가 ν•˜λ‚˜ μžˆλ‹€.

λ°”λ‘œ κ°•μ œ μΆ”μΆœκ³Ό μ˜΅μ…”λ„ μ²΄μ΄λ‹μ˜ 차이점 !

κ°•μ œ μΆ”μΆœμ€ nil 값을 λ°˜ν™˜ν•  수 μ—†κΈ° λ•Œλ¬Έμ— μœ„μ˜ μ½”λ“œλ₯Ό κ°•μ œ μΆ”μΆœλ‘œ μ§„ν–‰ν–ˆλ‹€λ©΄ λΆ„λͺ… 였λ₯˜λ₯Ό λ§Œλ“€μ—ˆμ„ 것이닀.

ν•˜μ§€λ§Œ μ˜΅μ…”λ„ 체이닝은 λ°˜ν™˜μ„ μ˜΅μ…”λ„ κ°’μœΌλ‘œ ν•΄μ£ΌκΈ° λ•Œλ¬Έμ— nil 값이 μ €μž₯λ˜μ–΄μžˆλ”λΌλ„ μΆ”μΆœμ΄ κ°€λŠ₯ν•˜λ‹€.πŸ’₯

λ‹€μ‹œ ν•œ 번 μ˜΅μ…”λ„ 체이닝이 μ•ˆμ „ν•œ λ°©λ²•μ΄λž€ 것을 μ•Œ 수 μžˆλŠ” 뢀뢄이닀.

 

λŒμ•„μ™€μ„œ, μœ„μ˜ μ˜΅μ…”λ„ 체이닝 예제 μ½”λ“œμ— 값을 ν• λ‹Ήν•˜μ—¬ λ‹€μ‹œ ν•œ 번 μ˜΅μ…”λ„ 체이닝을 ν•΄λ³΄μž.

// μ˜΅μ…”λ„ μ²΄μ΄λ‹μœΌλ‘œ κ°’ ν• λ‹Ή
seolhee.info = Info(phoneNum: 0000)
seolhee.info?.adress = Adress(city: "인천")
seolhee.info?.adress?.street = "계양ꡬ"

// μ˜΅μ…”λ„ 체이닝
let seolheeInfo: String? = seolhee.info?.adress?.street
// "계양ꡬ"

μœ„μ—μ„œ μž‘μ„±ν•œ μ½”λ“œμ— μ΄λ ‡κ²Œ 값을 ν• λ‹Ήν•΄μ£Όκ³  λ‹€μ‹œ μ˜΅μ…”λ„ 체이닝을 ν•΄μ£Όμ—ˆλ‹€.

값을 λ‹€ ν• λ‹Ήν•΄ μ£Όμ—ˆκΈ°μ— infoλΆ€ν„° μ°¨λ‘€λŒ€λ‘œ κ²€μ‚¬ν–ˆμ„ λ•Œ nil 값이 μ—†μ—ˆκ³ , street에 μ €μž₯된 값을 μ„±κ³΅μ μœΌλ‘œ λ°˜ν™˜ν–ˆλ‹€.

 

πŸ‘‰ 그런데 μœ„μ˜ μ½”λ“œμ˜ 주석을 ν™•μΈν•˜λ©΄ νŠΉμ΄ν•œ 점을 λ°œκ²¬ν•  수 μžˆλ‹€.

μ˜΅μ…”λ„ 체이닝은 λ°˜λŒ€λ‘œ, κ°’μ˜ 할당도 κ°€λŠ₯ν•˜λ‹€λŠ” 것 !

λ¬Όλ‘  μ—¬κΈ°μ„œλ„ μΆ”μΆœν•  λ•Œμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ,

μ΄μ–΄μ§€λŠ” λ‹€λ₯Έ ν”„λ‘œνΌν‹°λ“€μ— 값이 ν• λ‹Ήλ˜μ–΄μžˆμ§€ μ•Šλ‹€λ©΄ μ˜΅μ…”λ„ 체이닝 λ™μž‘μ€ 쀑간에 μ€‘λ‹¨λœλ‹€.

 

μ΄λ ‡κ²Œ μ˜΅μ…”λ„ 체이닝에 λŒ€ν•΄ μ•Œμ•„λ΄€λŠ”λ°,

μ—¬κΈ°μ„œ ν•œ 가지 μΆ”κ°€ν•˜κ³  싢은 λ‚΄μš©μ΄ μžˆλ‹€. 

μ˜΅μ…”λ„ 체이닝은 μ˜΅μ…”λ„ 바인딩과 κ²°ν•©ν•  수 μžˆλ‹€λŠ” 것.!!πŸ’₯

 

 βœοΈ μ˜΅μ…”λ„ 체이닝 + 바인딩

λ°”λ‘œ μ½”λ“œλ‘œ ν™•μΈν•΄λ³΄μž.

let seolhee: Person = Person(name: "seolhee")

// μ˜΅μ…”λ„ μ²΄μ΄λ‹μœΌλ‘œ κ°’ ν• λ‹Ή
seolhee.info = Info(phoneNum: 0000)
seolhee.info?.adress = Adress(city: "인천")
seolhee.info?.adress?.street = "계양ꡬ"

// μ˜΅μ…”λ„ 바인딩과 μ²΄μ΄λ‹μ˜ κ²°ν•©
if let information: String = seolhee.info?.adress?.street {
    print(information)
}
else {
    print("Can not find")
}

// "계양ꡬ"

μœ„μ˜ μ½”λ“œλ₯Ό 확인해보면 if let을 μ‚¬μš©ν•˜μ˜€κ³ , 뒀에 μ˜΅μ…”λ„ 체이닝 ꡬ문을 넣은 것을 확인할 수 μžˆλ‹€.

μ΄λ ‡κ²Œ μ˜΅μ…”λ„ 바인딩과 체이닝을 ν•¨κ»˜ μ‚¬μš©ν•˜λ©΄,

바인딩을 톡해 seolhee.info.adress.street의 결괏값이 nil이 μ•„λ‹˜μ„ ν™•μΈν•˜λŠ” λ™μ‹œμ—

informationμ΄λΌλŠ” μƒμˆ˜λ‘œ λ°›μ•„μ˜¬ 수 μžˆλ‹€.

πŸ‘‰ μ˜΅μ…”λ„ 바인딩은 μ΄λ ‡κ²Œ 체이닝과 ν•¨κ»˜μ“°λ©΄ ꡉμž₯히 μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

μ˜€λŠ˜μ€ κ°•μ œ μΆ”μΆœ, μ˜΅μ…”λ„ 바인딩, μ˜΅μ…”λ„ 체이닝. μ΄λ ‡κ²Œ λ‹€μ–‘ν•œ μ˜΅μ…”λ„ μΆ”μΆœ 방법에 λŒ€ν•΄ μ •λ¦¬ν–ˆλ‹€.

κ°•μ œ μΆ”μΆœμ€ 문제λ₯Ό ν’€λ©΄μ„œ 많이 μ‚¬μš©ν•΄λ΄€λŠ”λ°, 바인딩과 체이닝도 μ—°μŠ΅μ΄ 많이 ν•„μš”ν•  것 κ°™λ‹€.

μŠ€μœ„ν”„νŠΈλ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ ν•„μˆ˜μ μΈ λ‚΄μš©μ΄λ‹ˆ κΌ­ μ—°μŠ΅ν•΄μ„œ λ‚΄κ²ƒμ²˜λŸΌ μ‚¬μš©ν•  수 있게 ν•˜μž !


🌟 정리 🌟

μ˜΅μ…”λ„ μΆ”μΆœμ—λŠ” κ°•μ œ μΆ”μΆœ, μ˜΅μ…”λ„ 바인딩, 체이닝이 μžˆλŠ”λ°

κ°•μ œ μΆ”μΆœμ€ nil인지 ν™•μΈν•˜μ§€ μ•Šκ³  λ°”λ‘œ μΆ”μΆœν•˜λŠ” 것이고

바인딩은 ν™•μΈν•˜κ³  μΆ”μΆœ, 그리고 체이닝은 μ—°μ†ν•΄μ„œ ν™•μΈν•˜λ©° μΆ”μΆœν•˜λŠ” 방식이닀.

κ°•μ œ μΆ”μΆœμ€ 였λ₯˜ λ°œμƒ κ°€λŠ₯성이 λ†’μœΌλ‹ˆ 바인딩과 체이닝 μœ„μ£Όλ‘œ μ—°μŠ΅ν•˜μž !

 


μ°Έκ³ 

λŒ“κΈ€