ํด๋ก์ & ํํ ํด๋ก์
๐งโ๐ป์ด๋ฒ Swift ์๊ฐ์ ๋ฐฐ์๋ณผ ๊ฒ์ ๋ค์๊ณผ ๊ฐ๋ค. ๐จ๐ปโ๐ป
- ํด๋ก์ ๋ฅผ ๋ง๋ค๊ณ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- ํํ ํด๋ก์ ๋ฐ ๋จ์ถ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ๋ค์ด๋ ๋ฐฉ๋ฒ
1. ํด๋ก์ ๊ฐ ๋ฌด์์ธ๊ฐ์?๐ค
์ผ๋จ ํด๋ก์ ์ ๋ํด์ ๊ฐ๋จํ๊ฒ ์ธ๊ธํ์๋ฉด Swift์์ ์ฐ๋ฆฌ๊ฐ ์ํ ๋๋ง๋ค ์ ๋ฌํ ์ ์๊ณ ํธ์ถํ ์ ์๋ ์ฝ๋ ๋ฉ์ด๋ฆฌ๋ฅผ ๋งํ๋ค.
์ด ํจ์๋ ์ด๋ฆ์ด ์์ง๋ง, ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฌ์ค์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ฐ์ ๋ฐํ ํ์ง ์๋ ํจ์์ด๋ค.
ํด๋ก์ ๋ ์ค๊ดํธ๋ก ์์ํ๊ณ ๋๋๊ฒ ๋๋๋ฐ ์ด๋ ๋ค๋ฅธ๋ง๋ก ๋งค๊ฐ๋ณ์๋ ๋ฐํ ๊ฐ์ ์ ์ดํ๊ธฐ ์ํด ์ค๊ดํธ ์ธ๋ถ์ ์ฝ๋๋ฅผ ๋ฃ์ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ผ๋จ ํ์ต์ ํ๋ ๊ณผ์ ์๋ ๊ทธ๋ ๊ณ ์ ๋ฆฌ๋ฅผ ํ๋ ์ค์๋ ์ ํํ 100%์ดํด ํ๋ค๊ณ ํ๊ธฐ์๋ ๋ฌด๋ฆฌ๊ฐ ์๋ ๋ถ๋ถ์ด์๋ค.
๊ทธ๋์ ์ด๋ฒ์๋ The Swift Language Guide ์ ๊ณต์ ๋ฌธ์๋ก ๋์์ ๋ง์ด ๋ฐ์ ๋ณด์๋ค.
๊ณต์๋ฌธ์๋ฅผ ํตํด ๊ธฐ๋ณธ์ ์ธ ํด๋ก์ ์ ๋ํด ํ์ต์ ํ๊ณ ๋ณธ๋ก ์ผ๋ก ๋์ด๊ฐ๋ณด์!
https://jusung.gitbook.io/the-swift-language-guide/language-guide/07-closures
Closures โ The Swift Programming Language (Swift 5.7)
Closures Closures are self-contained blocks of functionality that can be passed around and used in your code. Closures in Swift are similar to blocks in C and Objective-C and to lambdas in other programming languages. Closures can capture and store referen
docs.swift.org
ํด๋น ๋ฌธ์์์๋ ์ ์ญํจ์, ์ค์ฒฉ ํจ์, ํด๋ก์ ํํ์์ ์ ์์ ๋ํ ๋น๊ต๋ฅผ ํตํด ๋จผ์ ์ดํดํ๊ธฐ๋ณด๋ค ํธํ๋ค.
- ์ ์ญ ํจ์ : ์ด๋ฆ์ด ์๊ณ ๊ฐ์ ์บก์ฒํ์ง ์๋ ํด๋ก์ .
- ์ค์ฒฉ ํจ์ : ์ด๋ฆ์ด ์๊ณ ๋๋ฌ์ธ๋ ํจ์์์ ๊ฐ์ ์บก์ฒํ ์ ์๋ ํด๋ก์ .
- ํด๋ก์ ํํ์ : ์ฃผ๋ณ ์ปจํ ์คํธ์์ ๊ฐ์ ์บก์ฒํ ์ ์๋ ๊ฐ๋จํ ๊ตฌ๋ฌธ์ผ๋ก ์์ฑ๋ ์ด๋ฆ ์๋ ํด๋ก์ .
ํด๋ก์ ํํ์ ๊ตฌ๋ฌธ์ ์ผ๋ฐ์ ์ธ ํ์์ ๋ค์๊ณผ ๊ฐ๋ค.

2. ํด๋ก์ ์์ฑ ๋ฐ ์ฌ์ฉ๋ฒ
์ด์ ๊ฐ๋จํ ์์ ๋ฅผ ํตํด ํด๋ก์ ์ ์ ๊ทผํด๋ณด์
let sayHello = { (name: String) -> String in
"Hi \(name)!"
}
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ in์ด๋ผ๋ ํค์๋๊ฐ ๋ณด์ธ๋ค. ํด๋ก์ ์ ๋งค๊ฐ๋ณ์์ ๋ฐํ ์ ํ ๋ฐ๋ก ๋ค์ ์ค๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ผ๋ฐ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋งค๊ฐ๋ณ์์ ๋ฐํ ์ ํ์ด ์ค๊ดํธ ์ธ๋ถ์ ์กด์ฌํ์ง๋ง ํด๋ก์ ์์๋ ์์ ๋งํ๋ฏ ๊ทธ๋ ๊ฒ ํ ์์๋ค.
๋ค๋ฅธ ์ฝ๋๋ฅผ ํ๋ฒ ๋ณด์
func getUserData(for id: Int) -> String {
if id == 1989 {
return "Taylor Swift"
} else {
return "Anonymous"
}
}
let data: (Int) -> String = getUserData
let user = data(1989)
print(user)
ํจ์ getUserData๋ ์ ์๋ฅผ ๋ฐ์๋ค์ฌ์ ๋ฌธ์์ด๋ก ๋ฐํ ํ๋ ํจ์์ด๋ค. ๊ทธ๋ฐ๋ฐ ํจ์์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค ๋ ํจ์์ ์ ํ์ ์ธ๋ถ ๋งค๊ฐ ๋ณ์ ์ด๋ฆ์ ๋ํ for๋ฅผ ํฌํจํ๊ณ ์์ง ์๋ค. ๋ฐ๋ผ์ ๋ณต์ฌ๋ณธ์ธ ํธ์ถ๋ ๋ data(for:1989)๊ฐ ์๋๋ผ data(1989)๋ฅผ ์ฌ์ฉํ๋ค.
์ด ์์ ์์๋ ๋์ผํ ๊ท์น์ผ๋ก ๋ชจ๋ ํด๋ก์ ์ ์ ์ฉ๋๋ค. ์์ ์ฒ์ ๋์๋ ์์ ์ sayHello๋ฅผ ์ฌ๊ธฐ์ ๋ค์ ํ๋ฒ ํธ์ถ ํด๋ณด๋ฉด ํจ์๋ฅผ ๋ณต์ฌํ ๋์ ๊ฐ์ด ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํ์ง ์๋๋ค. ์?? ์ธ๋ถ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ํจ์๋ฅผ ์ง์ ํธ์ถํ ๋์๋ง ์ค์ํ์ง ํด๋ก์ ๋ฅผ ์์ฑํ๊ฑฐ๋ ํจ์์ ๋ณต์ฌ๋ณธ์ ๋จผ์ ๊ฐ์ ธ์ฌ ๋๊ฐ ์๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
3. ํํ ํด๋ก์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
๋ง์ฝ ํจ์์ ๋ง์ง๋ง ์ธ์๊ฐ ์ฝ๋ก์ ๊ฐ ๋ค์ด๊ฐ ์๊ณ ํด๋น ํด๋ก์ ๊ฐ ๊ธธ์ด์ง๊ฒ ๋๋ค๋ฉด ํํ ํด๋ก์ ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
func someFunctionThatTakesAClosure(closure: () -> Void) {
// function body goes here
}
ํด๋ก์ ์ ์ธ์ ๊ฐ ๋ถ๋ถ๊ณผ ๋ฐํ ํ ๋ถ๋ถ์ ์๋ตํ๊ฑฐ๋
someFunctionThatTakesAClosure(closure: {
// closure's body goes here
})
๋ค์๊ณผ ๊ฐ์ด ํํํด๋ณผ ์ ์๋ค.
์ฌ์ค์ ํจ์๋ฅผ ๋๊ดํธ () {}๋ก ๋ฌถ๋ ๊ฒ, ์ผ๋ฐ์ ์ธ ์ ์ญ ํจ์ ํํ๊ฐ ์ฌ์ค์ ํด๋ก์ ํํ๋ฅผ ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์์๋ ๊ฒ์ธ๋ฐ,
์์์ ์ธ๊ธํ์๋ ์์ ๋ฅผ ๋ฐ๋ก ํํ ํด๋ก์ ๋ฅผ ์ด์ฉํด ํํํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
someFunctionThatTakesAClosure() {
// trailing closure's body goes here
}
4. ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์๋ค์ด๋ ๋ฐฉ๋ฒ
์ด ํํธ๋ ์์์ ๋ฐฐ์ด ํํ ํด๋ก์ ํํธ ๋๋ฌธ์ ํนํ ์ค์ํ๋ ๊ธฐ์ ๋ก ๊ฐ์ง๊ณ ์๋ค๋ฉด ์ถฉ๋ถํ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ ํ๋ฒ ๋ฐฐ์๋ณด์!
func makeArray(size: Int, using generator: () -> Int) -> [Int] {
var numbers = [Int]()
for _ in 0..<size {
let newNumber = generator()
numbers.append(newNumber)
}
return numbers
}
๋ค์ ์์ ๋ ํจ์๋ฅผ ์ํ๋ ํน์ ํ์๋งํผ ๋ฐ๋ณตํด ์ ์ ๋ฐฐ์ด์ ์์ฑ ํจ์๋ก ์์ธํ ํ ์ค์ฉ ๋ฏ์ด๋ณด๋ฉด,
- ํจ์ makeArray()๋ ๋ ๊ฐ์ ๋งค๊ฐ ๋ณ์๊ฐ ํ์ํ๋ฐ, ๊ทธ์ค ํ๋๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ ์์ ๊ฐ์์ด๊ณ ์ ์ ๋ฐฐ์ด์ ๋ฐํํ๋ค.
- ๋ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ ํจ์์ด๋ค. ๋งค๊ฐ ๋ณ์ ์์ฒด๋ฅผ ํ์ฉํ์ง ์์ง๋ง ํธ์ถ๋ ๋๋ง๋ค ํ๋์ ์ ์๋ฅผ ๋ฐํํ๋ค.
- makeArray() ๋ด๋ถ์์๋ ๋น ์ ์ ๋ฐฐ์ด์ ์๋ก ํ๋ ๋ง๋ ๋ค์ ์ฌ์ฉ์๊ฐ ์์ฒญํ ํ์๋งํผ ๋ฐ๋ณตํ๋ค.
- ๋ฐ๋ณต์ ํ ๋๋ง๋ค ์ฐ๋ฆฌ๋ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ generater() ํจ์๋ฅผ ํธ์ถํ๋ค. ์ด๊ฒ ํ๋์ ์๋ก์ด ์ ์๋ฅผ ๋ฐํํ๊ฒ ๋๋ค.
let rolls = makeArray(size: 50) {
Int.random(in: 1...20)
}
print(rolls)
๊ฒฐ๊ณผ๋ก๋ ์ด์ ์ซ์๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉํด์ผ ํ๋ ํจ์๋ฅผ ์ ๋ฌํด์ ์์์ ํฌ๊ธฐ์ ์ ์ ๋ฐฐ์ด์ ๋ง๋ค ์ ์๋ค๋ ๊ฑฐ๋ค.
learning by repetition
Swift๋ฅผ ๋ฐฐ์ฐ๋ ๊ณผ์ ์ค์ ํด๋ก์ ๋ถ๋ถ์ด ๊ฐ์ฅ ์ด๋ ต๋ค๊ณ ๋ค ํ๋๋ฐ ํ์คํ ๋ง๋ ๊ฒ ๊ฐ๋ค...