ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

img


๐Ÿ” Escaping Clousures


  • Apple์˜ iOS Dev Tutorial์„ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ @escaping์„ ์ฒ˜์Œ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠœํ† ๋ฆฌ์–ผ์ƒ์—์„œ๋„ ๊ฐ„๋žตํ•˜๊ฒŒ ๊ฐœ๋…์„ ์†Œ๊ฐœํ•ด์ฃผ๊ณ  ์žˆ์ง€๋งŒ ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

๐Ÿง Escaping vs Non-escaping


  • ์šฐ์„  escaping์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด escaping๊ณผ non-escaping์˜ ์ฐจ์ด๋ฅผ ์•Œ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ณ ๋ฏผ์„ ํ•˜๋Š” ์ƒํ™ฉ์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋กœ ํด๋กœ์ €๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ž…๋ ฅ๋˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    func callback(someFunction: () -> Void) { 
      someFunction()
    }
    
    callback {
    print ("someFunction์ด ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค."ใ€‹
    }
    // ์‹คํ–‰๊ฒฐ๊ณผ: "someFunction์ด ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค." ์ถœ๋ ฅ

    callbackํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ someFunction์„ ์ž…๋ ฅ๋ฐ›๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์— callback์€ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํด๋กœ์ € ํ•œ๊ฐœ์ธ trailing์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ์ผ๋ฐ˜์ ์ธ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์กฐ๊ธˆ ๋ฐ”๊ฟ”๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    func callback(someFunction: () -> Void) {
      let bucket = someFunction // ๋‹จ์ˆœ ์‹คํ–‰์ด ์•„๋‹Œ ์ƒ์ˆ˜์— ํด๋กœ์ €๋ฅผ ํ• ๋‹น
      bucket() // ํ• ๋‹น๋œ ์ƒ์ˆ˜๋ฅผ ์‹คํ–‰
    }

    ๋ณ€๊ฒฝ์ ์€ ๋‹จ์ˆœํžˆ ์ž…๋ ฅ๋ฐ›์€ ํ•จ์ˆ˜ ํด๋กœ์ €๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด์•„๋‹ˆ๋ผ ์ด ํด๋กœ์ €๋ฅผ ์ƒ์ˆ˜(๋˜๋Š” ๋ณ€์ˆ˜)์— ํ• ๋‹นํ•ด ๊ทธ ์ƒ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ตฌ์กฐ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค. ํด๋กœ์ €๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด์ด๋ฏ€๋กœ ํ• ๋‹นํ•˜๋Š” ๋กœ์ง์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๋ฉ”์„ธ์ง€๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    Non-escaping parameter 'someFunction' may only be called

    'Non-escaping' ํŒŒ๋ผ๋ฏธํ„ฐ์ธ someFunction์€ ํ˜ธ์ถœ๋ฐ–์— ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ฉ”์„ธ์ง€์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ• ๋‹น์€ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด์ฃ . ์‹คํ–‰๋งŒ ํ•  ์ˆ˜ ์žˆ๊ณ  ๋Œ€์ž…์„ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  ์ธ์ž๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ํด๋กœ์ €์˜ ํŠน์„ฑ์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”’Closure as a parameter


  • ์Šค์œ„ํ”„ํŠธ์—์„œ ํ•จ์ˆ˜์˜ ์ธ์ž๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋œ ํด๋กœ์ €๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํƒˆ์ถœ๋ถˆ๊ฐ€(Non-escape)์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์‹œ์—์„œ ์˜ค๋ฅ˜๋Š” ๋‹น์—ฐํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ ! Non-escapeํ•˜๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค์Œ์˜ ๋‘ ์˜๋ฏธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

    1. ํ•จ์ˆ˜ Scope ๋‚ด์—์„œ ์‚ฌ์šฉ

    2. (ํ• ๋‹น์ด ์•„๋‹Œ) ์ง์ ‘ ์‹คํ–‰์„ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉ

    ์œ„์˜ ์กฐ๊ฑด์ด ๊ธฐ๋ณธ ์„ธํŒ…์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

    ๐Ÿง ์™œ ์กฐ๊ฑด์ด ๋ถ™๋Š”๊ฐ€?

    ๋งŒ์•ฝ ์œ„์˜ ์กฐ๊ฑด์ด ์—†์ด ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ๋ฝํ•œ๋‹ค๋ฉด ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ ์บก์ฒ˜(Capture)๋ฅผ ํ†ตํ•ด ํด๋กœ์ €๊ฐ€ ํ•จ์ˆ˜ ๋ฐ”๊นฅ์œผ๋กœ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ƒ๊ฐํ•ด๋ณด๋ฉด Swift์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์ˆ˜์ด๋ฉฐ ํ•จ์ˆ˜ Scope์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํด๋กœ์ €์˜ ํ• ๋‹น์„ ํ—ˆ์šฉํ•˜๋ฉด ์ด Scope๋ฅผ ๋ฒ—์–ด๋‚˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค๋Š” ๊ฒƒ์ด์ฃ .


๐Ÿ”จ How to Escape?


  • ๊ทธ๋Ÿผ ํ•„์š”์— ๋”ฐ๋ผ ๋Œ€์ž…ํ•˜๊ฑฐ๋‚˜ ์ค‘์ฒฉํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•ด์•ผํ•  ๋•Œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”? ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด, ํƒˆ์ถœ(Escaping)ํ•˜๊ณ  ์‹ถ์„๋•Œ? ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ •์˜์‹œ ํƒˆ์ถœ์‹œํ‚ค๊ณ  ์‹ถ์€ ํด๋กœ์ € ํŒŒ๋ผ๋ฏธํ„ฐ ์•ž์— @escaping์„ ๋ถ™์ด๋ฉด ๋ฉ๋‹ˆ๋‹ค. 2๊ฐ€์ง€ ์ œ์•ฝ์กฐ๊ฑด์ด ์‚ฌ๋ผ์ง€๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ .

๐Ÿง ์™œ ๋ถˆํŽธํ•œ Non-escaping์„ ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ์ •์˜ํ–ˆ์„๊นŒ?


  • ํด๋กœ์ €์˜ ๊ธฐ๋ณธ ์†์„ฑ์„ Non-escaping์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ด๋Ÿฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ํด๋กœ์ €๊ฐ€ ํƒˆ์ถœ ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ ์ œ์•ฝ์กฐ๊ฑด ํ•˜์— ์žˆ๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋” ์ด์ƒ ๊ทธ ํด๋กœ์ €์— ๊ด€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์ƒ์˜ ์ง€์ €๋ถ„ํ•œ ์ผ๋“ค์„ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ์ด์ฃ .

    ์ข€ ๋” ํ’€์–ด์„œ ์„ค๋ช…ํ•ด๋ณด๋ฉด, ๋งŒ์•ฝ ์–ด๋–ค ํด๋กœ์ €๊ฐ€ ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜์—ˆ์„ ๋•Œ ์ด ๋ฉ”์†Œ๋“œ ์™ธ๋ถ€์—์„œ ํ•ด๋‹น ํด๋กœ์ €๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜ ์—†๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ด ํด๋กœ์ €๋ฅผ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ๋™์ž‘ํ•  ๋•Œ์—๋งŒ ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ž…๋ ฅ๋ฐ›์€ ํด๋กœ์ €๊ฐ€ ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์–ธ์ œ ์‚ฌ์šฉ๋  ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ์ƒ์—์„œ ํ•จ๋ถ€๋กœ ์ด ํด๋กœ์ €๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด์ฃ .

    ์ถ”๊ฐ€์ ์œผ๋กœ, ํƒˆ์ถœ๋ถˆ๊ฐ€ ํด๋กœ์ €๋Š” ๋‚ด๋ถ€์—์„œ selfํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด non-escaping์ด๋ฏ€๋กœ ์ด ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜์„œ ๋ฆฌํ„ด๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋  ๊ฒƒ์ด๊ณ , ์–ด๋–ค ๊ฐ์ฒด์— ์ข…์†๋˜๋Š”์ง€ ํ™•์‹คํ•˜๊ธฐ ๋•Œ๋ฌธ์— self ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด์ฃ . ๊ทธ๋ž˜์„œ ํด๋กœ์ € ๋‚ด์—์„œ self์— ๋Œ€ํ•œ ์•ฝํ•œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.


ref: ๊ผผ๊ผผํ•œ ์žฌ์€์”จ์˜ Swift ๋ฌธ๋ฒ•ํŽธ

๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
๋ฐ˜์‘ํ˜•
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG more
ยซ   2024/11   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
๊ธ€ ๋ณด๊ด€ํ•จ