-
[Swift] Closure, Syntax OptimizationSwift 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 ์ด๋ ๊ฒ ๋ฌธ๋ฒ ์ต์ ํ๋ฅผ ์๋ฃํ๋ค. ๋ฌธ๋ฒ ์ต์ ํ ์ ์ ๋นํด ๋ง์ด ๊ฐ๋จํด์ง ๊ฒ์ ๋ณผ ์ ์๋ค.
๋ฌธ๋ฒ ์ต์ ํ ์ฐ์ต์ ๋ง์ด ํด์ ๋ฌธ๋ฒ ์ต์ ํ ํ์ ์ฝ๋๋ฅผ ํ๋ฒ์ ์์๋ณผ ์ ์๋๋ก ํ์.

'Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Collection (Array, Dictionary, Set) (0) 2022.02.15 [Swift] Tuples (0) 2022.02.15 [Swift] Function - 3 (Implicit Return, Function Notation, Function Types) (0) 2022.02.15 [Swift] Function - 2 (Variadic Parameter, In-Out Parameter) (0) 2022.02.15 [Swift] Function - 1 (Defining/Calling Function, Parameter, Argument Label) (0) 2022.02.15