ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] Closure, Syntax Optimization
    Swift 2022. 2. 15. 02:46

    (๋ชจ๋“  ์ฝ”๋“œ๋Š” Playground์—์„œ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.)

     

    ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Closure์™€ Closure์˜ Syntax Optimization์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

     

    1. Closure (ํด๋กœ์ €)

    Closure๋Š” ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์ฝ”๋“œ ์กฐ๊ฐ์œผ๋กœ, ์ด๋ฆ„์ด ์žˆ๋Š” ํด๋กœ์ € (Named Closure)์™€ ์ด๋ฆ„์ด ์—†๋Š” ํด๋กœ์ € (Unnamed Closure) ๋กœ ๋‚˜๋‰œ๋‹ค.

    ์ด๋ฆ„์ด ์žˆ๋Š” ํด๋กœ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์•„๋Š” ํ•จ์ˆ˜์ด๊ณ , ์ด๋ฆ„์ด ์—†๋Š” ํด๋กœ์ €๋ฅผ ์ต๋ช… ํ•จ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค. 

     

     

    ์ง€๊ธˆ๋ถ€ํ„ฐ ๊ณต๋ถ€ํ•  ํด๋กœ์ €๋Š” ์ด๋ฆ„์ด ์—†๋Š” ํด๋กœ์ €๋ฅผ ๋งํ•œ๋‹ค.

     

     

    ๊ทธ๋ ‡๋‹ค๋ฉด ์–ธ์ œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์–ธ์ œ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?

    ํ•จ์ˆ˜๋Š” ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ๋ฐ˜๋“œ์‹œ ์ด๋ฆ„์„ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ˜๋ณต๋˜๋Š” ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์งค ๋•Œ์—๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    ๋ฐ˜๋ฉด, ํด๋กœ์ €๋Š” ๋ณต์žกํ•œ ์ฝ”๋“œ ์—†์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ผํšŒ์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. 

     

     

    ํด๋กœ์ €๋„ ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ First Class Citizen์ด๋‹ค.

    1. ๋ณ€์ˆ˜, ์ƒ์ˆ˜์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

    2. ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    3. ํ•จ์ˆ˜๋‚˜ ๋ฉ”์†Œ๋“œ์—์„œ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     

    ๋”ฐ๋ผ์„œ ํด๋กœ์ €๋„ ์ž๋ฃŒํ˜•์ด ํ•„์š”ํ•œ๋ฐ, ํ•จ์ˆ˜ ํƒ€์ž…๊ณผ ๋™์ผํ•˜๋‹ค. ๊ทธ ๋ง์ธ ์ฆ‰์Šจ, ํ•จ์ˆ˜์™€ ํด๋กœ์ €๋Š” ์„œ๋กœ ํ˜ธํ™˜๋œ๋‹ค.

    ๊ทธ๋ž˜์„œ ์ž๋ฃŒํ˜•์ด ๊ฐ™๋‹ค๋ฉด ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ณณ์— ํด๋กœ์ €๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฐ˜๋Œ€๋กœ ํด๋กœ์ €๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ณณ์— ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     

    ํด๋กœ์ €๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    ํด๋กœ์ €๋Š” ํ•จ์ˆ˜์™€ ๋‹ฌ๋ฆฌ func ํ‚ค์›Œ๋“œ๊ฐ€ ์—†๊ณ , ๋ชจ๋“  ์š”์†Œ๊ฐ€ { } ๋‚ด์— ํฌํ•จ๋œ๋‹ค.

    ํด๋กœ์ €๋Š” in ํ‚ค์›Œ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํด๋กœ์ € ํ—ค๋“œ์™€ ํด๋กœ์ € ๋ฐ”๋””๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ, parameters -> ReturnType ๋ถ€๋ถ„์„ ํด๋กœ์ € ํ—ค๋“œ, statements๋ฅผ ํด๋กœ์ € ๋ฐ”๋””๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. 

     

     

    ํด๋กœ์ €๋„ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฆฌํ„ดํ˜•์„ ์ƒ๋žตํ•˜์—ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋•Œ in ํ‚ค์›Œ๋“œ๋„ ์ƒ๋žต์„ ํ•œ๋‹ค.

    ํด๋กœ์ €๋ฅผ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. 

    ์ด๋ฅผ ๋ฌธ๋ฒ• ์ตœ์ ํ™” (Syntax Optimization) ๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ๋จผ์ € ํด๋กœ์ €์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณธ ํ›„์— ๊ณต๋ถ€ํ•˜๋„๋ก ํ•˜์ž.

     

     

     

    ํด๋กœ์ €๋Š” Global Scope์—์„œ ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

    ํด๋กœ์ €๋ฅผ Global Scope์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด "Top-level statement๋Š” ํด๋กœ์ € ํ‘œํ˜„์‹์œผ๋กœ ์‹œ์ž‘ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค"๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

     

    ๋”ฐ๋ผ์„œ Global Scope์—์„œ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํด๋กœ์ €๋ฅผ ์ƒ์ˆ˜๋‚˜ ๋ณ€์ˆ˜์— ์ €์žฅํ•ด์•ผํ•œ๋‹ค. 

    ๊ทธ๋ฆฌ๊ณ  ํด๋กœ์ €๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” ํ•จ์ˆ˜์™€ ๊ฐ™์ด ์ƒ์ˆ˜ ๋˜๋Š” ๋ณ€์ˆ˜์˜ ์ด๋ฆ„ ๋’ค์— ()๋ฅผ ๋ถ™์ด๋ฉด ๋œ๋‹ค.

     

     

     

    ๋˜ํ•œ ์ฃผ์˜ํ•ด์•ผํ•  ์ ์ด ์žˆ๋Š”๋ฐ, ํด๋กœ์ €์—์„œ๋Š” Argument Label์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

    ๋”ฐ๋ผ์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š” ํด๋กœ์ €๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ์—๋Š” Argument Label์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ธ์ž๋งŒ ์ „๋‹ฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

    ํด๋กœ์ €๋Š” Argument Label์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

    ํด๋กœ์ € ํƒ€์ž…์€ (Int) -> String ํ˜•์ด๊ณ , 2021์„ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ๋ฌธ์ž์—ด "Happy New Year 2021!"์„ ๋ฆฌํ„ดํ•œ๋‹ค.

     

    ์ฐธ๊ณ ๋กœ! ํ•จ์ˆ˜์—์„œ๋„ ์ƒ์ˆ˜๋‚˜ ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ์—๋Š” Argument Label์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ์•Œ์•„๋‘์ž!

     

     

     

    ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ฒˆ์—๋Š” ํด๋กœ์ €๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•ด๋ณด์ž.

    ํด๋กœ์ €๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅํ•˜๋‹ค.

    greeting์ด๋ผ๋Š” ์ƒ์ˆ˜์— (Int) -> (String) ํƒ€์ž…์˜ ํด๋กœ์ €๋ฅผ ์ €์žฅํ•˜๊ณ , ํ•จ์ˆ˜ sayGreeting์„ ์„ ์–ธํ•œ ํ›„์— sayGreeting ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ๋‹ค.

     

    ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํด๋กœ์ € greeting์ด sayGreeting์ด๋ผ๋Š” ํ•จ์ˆ˜์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋˜๊ณ , ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ print๋ฌธ์—์„œ ํด๋กœ์ € greeting์„ ํ˜ธ์ถœํ•˜๊ณ  2021๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•œ๋‹ค.

    ํ˜ธ์ถœ๋œ ํด๋กœ์ € greeting์€ 2021์„ Intํ˜•์œผ๋กœ ๋ฐ›์•„์„œ ๋ฌธ์ž์—ด์„ ๋ฆฌํ„ดํ•˜๋Š”๋ฐ, 

    ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” "Happy New Year 2021!"์ด ์ถœ๋ ฅ์ด ๋œ๋‹ค.

     

     

     

    ํด๋กœ์ €๋ฅผ typealias๋ฅผ ์ด์šฉํ•ด์„œ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

    typealias๋กœ (Int) -> String ํƒ€์ž…์„ IntToStringClosure์— ์ €์žฅํ•˜๊ณ ,

    ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— (Int) -> String์ด ์•„๋‹Œ IntToStringClosure๋ฅผ ์จ์ฃผ๋ฉด ๋œ๋‹ค.

    typealias๋Š” ์ƒˆ๋กœ์šด ์ž๋ฃŒํ˜•์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ณ„๋ช…์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

     

     

    ํด๋กœ์ € ๋ฐ”๋”” ๋‚ด์˜ ์ฝ”๋“œ๊ฐ€ ์งง์„ ๊ฒฝ์šฐ, ์•„๋ž˜์™€ ๊ฐ™์ด ํด๋กœ์ € ์ž์ฒด๋ฅผ ์ง์ ‘ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

    ์•„๋ž˜ ์ฝ”๋“œ๋Š” ์œ„์˜ ์˜ˆ์‹œ์—์„œ ์ผ๋˜ ํ•จ์ˆ˜์˜ ์ธ์ž์— ํด๋กœ์ €๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•œ ๊ฒƒ์ด๋‹ค.

     

     

    2. Syntax Optimization (๋ฌธ๋ฒ• ์ตœ์ ํ™”)

    ์ด๋ฒˆ์—๋Š” ํด๋กœ์ €์˜ Syntax Optimization (๋ฌธ๋ฒ• ์ตœ์ ํ™”) ์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•ด๋ณด์ž.

     

    ๋ฌธ๋ฒ• ์ตœ์ ํ™”๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ 5๊ฐ€์ง€ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

     

    1. ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹๊ณผ ๋ฆฌํ„ด ํ˜•์‹์„ ์ƒ๋žตํ•œ๋‹ค. 

    2. ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๊ณผ in ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ๋žตํ•˜๊ณ , ํด๋กœ์ € ๋‚ด๋ถ€์— ์žˆ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์„ Shorthand Argument Name์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค. 

    3. ํด๋กœ์ € ๋ฐ”๋”” ๋‚ด์˜ ์ฝ”๋“œ๊ฐ€ ๋‹จ์ผ ๋ฆฌํ„ด๋ฌธ์ด๋ผ๋ฉด, return ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ๋žตํ•ด์ค€๋‹ค. (Implicit Return)

    4. ํด๋กœ์ €๊ฐ€ ๋งˆ์ง€๋ง‰ ํŒŒ๋ผ๋ฏธํ„ฐ๋ผ๋ฉด, Trailing Closure๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค. Trailing Closure๋Š” () ๋’ค์— ํด๋กœ์ €๊ฐ€ ์˜ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Argument Label์ด ๋‚จ์•„์žˆ๋‹ค๋ฉด ์‚ญ์ œํ•œ๋‹ค.

    5. ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๊ด„ํ˜ธ๋ฅผ ์ƒ๋žตํ•œ๋‹ค. 

     

     

    ์œ„์—์„œ ์ผ๋˜ ์ฝ”๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฐจ๋ก€๋Œ€๋กœ ๋ฌธ๋ฒ• ์ตœ์ ํ™”๋ฅผ ํ•ด๋ณด์ž.

     

    1. ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹๊ณผ ๋ฆฌํ„ด ํ˜•์‹์„ ์ƒ๋žตํ•œ๋‹ค.

    Step #1

     

    2. ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๊ณผ in ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ๋žตํ•˜๊ณ , ํด๋กœ์ € ๋‚ด๋ถ€์— ์žˆ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์„ Shorthand Argument Name์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค. 

    Step #2

     

    3. ํด๋กœ์ € ๋ฐ”๋”” ๋‚ด์˜ ์ฝ”๋“œ๊ฐ€ ๋‹จ์ผ ๋ฆฌํ„ด๋ฌธ์ด๋ผ๋ฉด, return ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ๋žตํ•ด์ค€๋‹ค. (Implicit Return)

    Step #3

     

    4. ํด๋กœ์ €๊ฐ€ ๋งˆ์ง€๋ง‰ ํŒŒ๋ผ๋ฏธํ„ฐ๋ผ๋ฉด, Trailing Closure๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค. Trailing Closure๋Š” () ๋’ค์— ํด๋กœ์ €๊ฐ€ ์˜ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Argument Label์ด ๋‚จ์•„์žˆ๋‹ค๋ฉด ์‚ญ์ œํ•œ๋‹ค.

    Step #4

     

    5. ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๊ด„ํ˜ธ๋ฅผ ์ƒ๋žตํ•œ๋‹ค. 

    Step #5

     

     

    ์ด๋ ‡๊ฒŒ ๋ฌธ๋ฒ• ์ตœ์ ํ™”๋ฅผ ์™„๋ฃŒํ–ˆ๋‹ค. ๋ฌธ๋ฒ• ์ตœ์ ํ™” ์ „์— ๋น„ํ•ด ๋งŽ์ด ๊ฐ„๋‹จํ•ด์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    ๋ฌธ๋ฒ• ์ตœ์ ํ™” ์—ฐ์Šต์„ ๋งŽ์ด ํ•ด์„œ ๋ฌธ๋ฒ• ์ตœ์ ํ™” ํ›„์˜ ์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ์— ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ž.

     

    ๋Œ“๊ธ€

Designed by Tistory.