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

[Swift] ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜λŠ” 이유, κ°’ 캑쳐(Capturing Value)

by seolhee2750 2021. 9. 11.

ν΄λ‘œμ €λŠ” μŠ€μœ„ν”„νŠΈμ—μ„œ 기본적인 κ°œλ…μ΄μ§€λ§Œ,, 정말 μ–΄λ €μš΄ κ°œλ…μ΄κΈ°λ„ ν•˜λ‹€.

이전 κΈ€μ—μ„œ ν΄λ‘œμ €μ˜ 기초적인 λ‚΄μš©μ— λŒ€ν•΄ λ‹€λ€˜λŠ”λ°, μ˜€λŠ˜μ€ ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ μ™€

μ €λ²ˆ κΈ€μ—μ„œλŠ” 닀루지 λͺ»ν•œ κ°’ 캑쳐에 λŒ€ν•΄ 정리해보렀고 ν•œλ‹€.

 

πŸ“Ž ν΄λ‘œμ € μ‚¬μš© λͺ©μ 

ν΄λ‘œμ €λŠ” μ½”λ“œλ₯Ό 효율적으둜 μž‘μ„±ν•˜λŠ”λ°μ— 큰 도움을 μ€€λ‹€.

ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜λŠ” λ°μ—λŠ” μ•„μ£Ό λ‹€μ–‘ν•œ λͺ©μ μ΄ μžˆκ² μ§€λ§Œ,

κ·Έ μ€‘μ—μ„œλ„ κ°€μž₯ μ€‘μš”ν•˜κ³ , 많이 μ“°μ΄λŠ” 뢀뢄이 μžˆλ‹€.

 

#1 higher order function

μΈν’‹μœΌλ‘œ ν•¨μˆ˜λ₯Ό 받을 수 μžˆλŠ” ν•¨μˆ˜λ₯Ό λœ»ν•œλ‹€. λ°”λ‘œ κ³ μ°¨ν•¨μˆ˜,!!
μΈν’‹μœΌλ‘œ 쀄 ν•¨μˆ˜λ₯Ό λ”°λ‘œ λ§Œλ“€μ–΄ μ‚¬μš©ν•  μˆ˜λ„ μžˆμ§€λ§Œ, κ³ μ°¨ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” κ·Έ μžλ¦¬μ—μ„œ λ°”λ‘œ
ν΄λ‘œμ €λ‘œ λ§Œλ“€μ–΄ 인풋을 쀄 μˆ˜λ„ μžˆλ‹€. 이 λ•Œ ν΄λ‘œμ €λ₯Ό 많이 μ‚¬μš©ν•˜κ²Œ λœλ‹€.

 

#2 completion block

μ–΄λ– ν•œ νƒœμŠ€ν¬κ°€ μ™„λ£Œλ˜μ—ˆμ„ λ•Œ μˆ˜ν–‰ν•˜λŠ” 블둝을 λœ»ν•œλ‹€.
ν΄λ‘œμ €λŠ” 비동기 μž‘μ—…μ— 많이 μ‚¬μš©λ˜λŠ”λ°,
비동기적인 μ–΄λ– ν•œ νƒœμŠ€ν¬κ°€ λλ‚˜κ³  λ‚˜μ„œ μˆ˜ν–‰ν•΄μ•Ό ν•  블둝을 ν΄λ‘œμ €λ‘œ μž‘μ„±ν•˜λ©΄ νŽΈλ¦¬ν•˜λ‹€.

 

두 가지 λͺ¨λ‘ λ„ˆλ¬΄λ„ˆλ¬΄ μ€‘μš”ν•˜μ§€λ§Œ,

μš°λ¦¬λŠ” 였늘 κ°’ 캑쳐λ₯Ό μ•Œμ•„λ³΄κΈ°λ‘œ ν–ˆμœΌλ―€λ‘œ 두 번째 μ»΄ν”Œλ¦¬μ…˜ 블둝 ν•­λͺ©μ— μ§‘μ€‘ν•΄λ³΄μž.

 

μœ„μ—μ„œ μ–˜κΈ°ν–ˆλ“―μ΄ ν΄λ‘œμ €λŠ” 비동기 μž‘μ—…μ— 많이 μ‚¬μš©λ˜λŠ”λ°,

ν΄λ‘œμ €λ₯Ό 톡해 비동기 μ½œλ°±μ„ μž‘μ„±ν•˜λŠ” 경우 ν˜„μž¬ μƒνƒœλ₯Ό 미리 νšλ“ν•΄ 두지 μ•ŠμœΌλ©΄

μ‹€μ œλ‘œ ν΄λ‘œμ €μ˜ κΈ°λŠ₯을 μ‹€ν–‰ν•˜λŠ” μˆœκ°„μ—λŠ” μƒμˆ˜λ‚˜ λ³€μˆ˜κ°€ 이미 λ©”λͺ¨λ¦¬μ— μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” κ²½μš°κ°€ λ°œμƒν•  수 μžˆλ‹€.

λ”°λΌμ„œ 이 λ•Œ ν•„μš”ν•œ 것이 λ°”λ‘œ ν΄λ‘œμ €μ˜ κ°’ 캑쳐 κΈ°λŠ₯이닀.


πŸ“Ž κ°’ 캑쳐 (Capturing Value)

κ°’ μΊ‘μ³λŠ” 말 κ·ΈλŒ€λ‘œ 값을 μΊ‘μ³ν•΄μ„œ μ‚¬μš©ν•˜λŠ” 것을 λ§ν•œλ‹€.

값을 μΊ‘μ³ν•΄μ„œ 가지고 μžˆλ‹€κ°€, ν•„μš”ν•  λ•Œλ§ˆλ‹€ μ΄μš©ν•˜λŠ” 것이닀.

 

쀑첩 ν•¨μˆ˜λ‘œ μ„€λͺ…ν•˜λ©΄ 이해가 μ‰¬μšΈ 것 κ°™μ•„ μ•Œλ§žλŠ” 예제λ₯Ό μž‘μ„±ν–ˆλ‹€.

func add(num: Int) -> (() -> Int) {
    var total = 0
    func adding() -> Int {
        total += num
        return total
    }
    return adding
}

let add_1 = add(num: 1)
let add_2 = add(num: 1)

add_1() // 1
add_1() // 2
add_1() // 3

add_2() // 1
add_2() // 2
add_2() // 3
  • μ΅œμƒλ‹¨μ˜ add ν•¨μˆ˜λ₯Ό 보면 리턴 νƒ€μž…μ΄ ν•¨μˆ˜ 객체이고,
    μ•ˆμ— addingμ΄λΌλŠ” ν•¨μˆ˜κ°€ μ •μ˜λ˜μ–΄μžˆλŠ” λͺ¨μŠ΅μ„ λ³Ό 수 μžˆλ‹€.
  • addμ—μ„œλŠ” total λ³€μˆ˜λ₯Ό μ •μ˜ν–ˆκ³ , addingμ—μ„œ total을 μ΄μš©ν•΄ μ—°μ‚°, total을 λ¦¬ν„΄ν•œλ‹€.
    add ν•¨μˆ˜μ˜ λ§ˆμ§€λ§‰μ—λŠ” adding ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•œλ‹€.
  • add ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” add_1, add_2 μƒμˆ˜λ₯Ό μ •μ˜ν•΄μ£Όμ—ˆκ³ ,
    각 μƒμˆ˜ λͺ¨λ‘ num μΈμžμ— 1을 ν• λ‹Ήν–ˆλ‹€.
  • μ•„λž˜μ—λŠ” add_1 μƒμˆ˜μ™€ add_2 μƒμˆ˜λ₯Ό μ„ μ–Έν•΄μ£Όμ—ˆλŠ”λ°,
    주석을 ν™•μΈν•˜λ©΄ μ„ μ–Έν•  λ•Œλ§ˆλ‹€ 결과값이 μ¦κ°€λ˜λŠ” λͺ¨μŠ΅μ„ λ³Ό 수 μžˆλ‹€.
    μ΄λŠ” total λ³€μˆ˜κ°€ μΊ‘μ³λ˜μ–΄, μƒˆλ‘­κ²Œ 선언될 λ•Œλ§ˆλ‹€ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šκ³ 
    κ·Έ 전에 캑쳐된 κ°’μœΌλ‘œ κ³„μ†ν•΄μ„œ μ‚¬μš©λœλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

 

πŸ‘‰ μ΄λ ‡κ²Œ κ°’ 캑쳐λ₯Ό ν†΅ν•˜λ©΄ 각각의 add ν•¨μˆ˜λŠ”

μ–Έμ œ ν˜ΈμΆœλ˜λ”λΌλ„ μžμ‹ λ§Œμ˜ total λ³€μˆ˜λ₯Ό 가지고 μΉ΄μš΄νŠΈν•˜κ²Œ λœλ‹€.

μ΄λŠ” 각각 μžμ‹ λ§Œμ˜ total μ°Έμ‘°λ₯Ό νšλ“(캑쳐)ν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€. πŸ’₯


🌟 정리

ν΄λ‘œμ €λŠ” κ³ μ°¨ν•¨μˆ˜μ™€ 비동기 μ½œλ°±μ— 많이 μ΄μš©λ˜λŠ”λ°,

κ·Έ μ€‘μ—μ„œλ„ 비동기 μ½œλ°±μ— μ΄μš©λ˜λŠ” μ΄μœ λŠ” ν΄λ‘œμ €μ˜ κ°’ 캑쳐 κΈ°λŠ₯ λ•Œλ¬Έμ΄λ‹€.

κ°’ μΊ‘μ³λŠ” 값을 미리 νšλ“, 선언될 λ•Œλ§ˆλ‹€ νšλ“ν•œ κ°’μ˜ 참쑰에 연산을 λˆ„μ ν•˜λŠ” 것이닀.

 


μ°Έκ³ 

  • πŸ“– μŠ€μœ„ν”„νŠΈ ν”„λ‘œκ·Έλž˜λ°
  • πŸ“€ 패슀트캠퍼슀 온라인 κ°•μ˜ -  iOS μ•± 개발 μ˜¬μΈμ› νŒ¨ν‚€μ§€

λŒ“κΈ€