๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โŒจ๏ธ Language/swift

[Swift] Escaping Closure

by hyebin (Helia) 2023. 5. 20.
๋ฐ˜์‘ํ˜•

์ด์Šค์ผ€์ดํ•‘ ํด๋กœ์ €(Escaping Closure)

  • escaping ํด๋กœ์ €๋Š” ํด๋กœ์ €๊ฐ€ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋์„ ๋•Œ, ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋œ ํ›„ ์‹คํ–‰๋˜๋Š” ํด๋กœ์ €
  • ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… ์•ž์— @escaping ์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•จ
  • ์ด์Šค์ผ€์ดํ•‘ ํด๋กœ์ €์—์„œ๋Š” self๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์–ธ๊ธ‰ํ•ด์•ผ ํ•จ
  • ์ด์Šค์ผ€์ดํ•‘ ํด๋กœ์ €๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ์˜ˆ๋กœ๋Š” ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰๋˜๋Š” HTTP Request CompletionHandler์ด ์žˆ์Œ
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    completionHandlers.append(completionHandler)
}

 

Non-Escaping Closure

  • ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉ
  • ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ ํด๋กœ์ €๋ฅผ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜์— ๋Œ€์ž…ํ•  ์ˆ˜ ์—†์Œ
    • Non-escaping ํด๋กœ์ €๊ฐ€ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜์— ํ• ๋‹น๋˜๋ฉด ํด๋กœ์ €๊ฐ€ ์›๋ž˜ ๋ฒ”์œ„ ๋ฐ–์—์„œ ์ €์žฅ ๋ฐ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ๋™์ž‘ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
func outer(closure: () -> ()) {  
    var i = closure // @escaping์œผ๋กœ ํƒ€์ž… ์ถ”๋กœ๋จ, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
    var j: () -> () = closure // ํƒ€์ž… ๋ช…์‹œ, ์˜ค๋ฅ˜ ๋ฐœ์ƒ
}
  • ์ค‘์ฒฉ ํ•จ์ˆ˜์—์„œ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์ค‘์ฒฉํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•  ์ˆ˜ ์—†์Œ
func outer(closure: () -> ()) -> () -> () {
    func inner() {
        closure()
    }
    return inner
}
print(outer {
    print("1")
})

func outer() -> (){
    private func ii() {
        print(1)
    }
    return ii()
}

print(outer())
  • ํ•จ์ˆ˜์˜ ์‹คํ–‰ ํ๋ฆ„์„ ํƒˆ์ถœํ•˜์ง€ ์•Š์•„, ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ „ ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋˜์–ด์•ผ ํ•จ

 

Non-Escaping Closure ์™€ Escaping Closure

  • ์ปดํŒŒ์ผ๋Ÿฌ์˜ ํผํฌ๋จผ์Šค์™€ ์ตœ์ ํ™” ๋•Œ๋ฌธ์— escaping, non-escaping ํด๋กœ์ €๋ฅผ ๋‚˜๋ˆ ์„œ ์‚ฌ์šฉ
  • non-escaping ํด๋กœ์ €๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํด๋กœ์ €์˜ ์‹คํ–‰์ด ์–ธ์ œ ์ข…๋ฃŒ๋˜๋Š”์ง€ ์•Œ๊ธฐ ๋•Œ๋ฌธ์—, ๋•Œ์— ๋”ฐ๋ผ ํด๋กœ์ €์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŠน์ • ๊ฐ์ฒด์— ๋Œ€ํ•œ retain, release ๋“ฑ์˜ ์ฒ˜๋ฆฌ๋ฅผ ์ƒ๋žตํ•ด ๊ฐ์ฒด์˜ ๋ผ์ดํ”„์‹ธ์ดํด(life-cycle)์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
  • esacping ํด๋กœ์ €๋Š” ํ•จ์ˆ˜ ๋ฐ–์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋กœ์ €๊ฐ€ ํ•จ์ˆ˜ ๋ฐ–์—์„œ๋„ ์ ์ ˆํžˆ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด, ํด๋กœ์ €์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ์ฐธ์กฐ์‹ธ์ดํด(reference cycles) ๊ด€๋ฆฌ ๋“ฑ์„ ํ•ด์ค˜์•ผ ํ•จ
    •  ์ปดํŒŒ์ผ๋Ÿฌ์˜ ํผํฌ๋จผ์Šค์™€ ์ตœ์ ํ™”์— ์˜ํ–ฅ์„ ๋ผ์น˜๊ธฐ ๋•Œ๋ฌธ์— Swift์—์„œ๋Š” ํ•„์š”ํ•  ๋•Œ๋งŒ escaping ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ๋ถ„
๋ฐ˜์‘ํ˜•