๊ณ ์ฐจํจ์
(Higher-order Function)
"๊ณ ์ฐจํจ์๋ ๋ฌด์์ผ๊น?๐คจ"
๋ค๋ฅธ ํจ์๋ฅผ ์ ๋ฌ์ธ์(๋งค๊ฐ๋ณ์)๋ก ๋ฐ๊ฑฐ๋
ํจ์์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ํจ์๋ก ๋ณํํ๋ ํจ์์ด๋ค.
์..?๐ง
ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ๊ณ .. ํจ์๋ก ๋ณํํ๋ค..?
ํด๋ก์ ..?
๋ง์์..! ์ด๋
์๋ ์ผ๊ธ๊ฐ์ฒด(first-class object)์ ์ฐ๊ด์ด ์์ต๋๋ค!๐ซข
์์ ํ ๋ฒ ๋ ์ ๋ฆฌํ์๋ ํด๋ก์ !
Named Closure, Unnamed Closure๋ ์ผ๊ธ๊ฐ์ฒด(์ผ๊ธ์๋ฏผ)์ด๊ธฐ ๋๋ฌธ์
ํจ์์ ์ ๋ฌ์ธ์๋ก ์ ๋ฌํ ์ ์๊ณ , ํจ์์ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ฐํํ ์ ์๋ค๋ ํน์ง์ ๊ฐ์ง๊ณ ์์์ฃ ?
์ด ํน์ง์ ์ฝ๋์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก '๊ณ ์ฐจํจ์'์์!
์ ๋ชฉ์์ ์ ์ ์๋ฏ ๊ณ ์ฐจํจ์์๋ ๋ํ์ ์ผ๋ก
map, filter, reduce๊ฐ ์์ด์.
๊ทธ ์ธ์๋ compactMap, flatMap, forEach ๋ฑ์ด ์์ง๋ง,
์ฐ์ ์ map, filter, reduce๋ฅผ ์ ๋ฆฌํด์
ํ์คํ๊ฒ ์๊ณ ๋์ด๊ฐ ๋ณด๋๋ก ํฉ์๋ค!
ํด๋ก์ ๊ฐ๋
์ ์ด๋ ์ ๋ ์ดํดํ๊ณ ์๋ค๋ฉด,
์๋ง ์๋ ์์๋ค๋ง ๋ด๋ ๋ฐ๋ก ์ดํด๋ ๊ฐ๋จํ ๋
์๋ค์ด์์.ใ
ใ
map
map์ ์ปจํ
์ด๋ ๋ด๋ถ์ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๋ณํํ์ฌ ์๋ก์ด ์ปจํ
์ด๋๋ฅผ ์์ฑํ๋ ํจ์์์.
(์ปจํ
์ด๋: Array, Set, Dictonary์ ๊ฐ์ ๋ฐ์ดํฐ ํ์
)
๋ฐ๋ก ์์๋ก ์ดํดํด๋ด
์๋ค!
๊ณ ์ฐจํจ์๋ฅผ ์ฌ์ฉํด๋ณด๊ธฐ ์ ์ ์์ฃผ ์ฌ์ฉํ๋ for๋ฌธ์ ํ์ฉํด์
String ํ์
๋ฐฐ์ด์ Int ํ์
๋ฐฐ์ด๋ก ๋ณํํด๋ณผ๊ฒ์.
let numbers = ["1", "2", "3", "4", "5"]
var numArray: [Int] = []
for i in numbers {
if let stringToInt = Int(i) {
numArray.append(stringToInt)
}
}
print(numArray) // [1, 2, 3, 4, 5]
์ด๋ ๊ฒ ๋๊ฒ ์ฃ ?
์ด๊ฑธ map์ ํ์ฉํด์ ๋ณํํด๋ณด๋ฉด!
let stringArray = ["1", "2", "3", "4", "5"]
var numberArray: [Int] = []
numberArray = stringArray.map {
if let stringToInt = Int($0) {
return stringToInt
}
return 0
}
print(numberArray) // [1, 2, 3, 4, 5]
์..? ๋ ๊ฐ๋จํด์ง๊ฑฐ๋ผ ์๊ฐํ๋๋ฐ..
๋ณ๋ก ์ฐจ์ด๊ฐ ์๋ค.. ๋ผ๋ ์๊ฐ์ด ๋์์ฃ ..?๐
๋ ๊ฐ๋จํ๊ฒ ํด๋ณผ๊น์?
numberArray = stringArray.map { Int($0)! }
print("๋ ๊ฐ๋จํ๊ฒ: \(numberArray)") // ๋ ๊ฐ๋จํ๊ฒ: [1, 2, 3, 4, 5]
์ง โจ
์๋ ์ฝ๋๋ ๋ฐฉ๊ธ์ ์์์ ์ผ๋ ์ฝ๋์์!
ํํ ๋ฐฉ์์ ์ฐจ์ด์
๋๋ค!
($๋ฅผ ์ฌ์ฉํ๋๋ ์ํ๋๋์ ์ฐจ์ด)
let stringArray = ["1", "2", "3", "4", "5"]
var numberArray: [Int] = []
numberArray = stringArray.map { a in
if let stringToInt = Int(a) {
return stringToInt
}
return 0
}
print(numberArray) // [1, 2, 3, 4, 5]
let stringArray = ["1", "2", "3", "4", "5"]
var numberArray: [Int] = []
numberArray = stringArray.map {
if let stringToInt = Int($0) {
return stringToInt
}
return 0
}
print(numberArray) // [1, 2, 3, 4, 5]
์ด๋ฒ์๋ Int ๋ฐฐ์ด์ 2๋ฐฐ๋ก ๊ณฑํด์ ๋ฐฐ์ด์ ๋ด์๋ณด๊ณ ,
Int ๋ฐฐ์ด์ String ํ์
์ผ๋ก ๋ณํํด์ ๋ด์๋ณผ๊ฒ์.
์๊น์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋จผ์ for๋ฌธ์ ํ์ฉํด๋ณผ๊ฒ์!
let nums = [1, 2, 3, 4, 5]
var doubledNums: [Int]
var numsToStirng: [String]
doubledNums = [Int]()
numsToStirng = [String]()
for num in nums {
doubledNums.append(num * 2)
numsToStirng.append("\(num)")
}
print(doubledNums) // [2, 4, 6, 8, 10]
print(numsToStirng) // ["1", "2", "3", "4", "5"]
์ด๋ ๊ฒ ๋๊ฒ ์ฃ ?
์ด๊ฑธ map์ ํ์ฉํด์ ๋ฐ๊ฟ๋ณผ๊ฒ์.
๋จผ์ ์์๋ฅผ 2๋ฐฐ๋ก ๊ณฑํด์ ๋ฐฐ์ด์ ๋ด๊ธฐ!
doubledNums = nums.map({ (num: Int) -> Int in
return num * 2
})
print(doubledNums) // [2, 4, 6, 8, 10]
๋ ๊ฐ๋จํ๊ฒ ํด๋ณด๋ฉด
doubledNums = nums.map({ $0 * 2 })
print(doubledNums) // // [2, 4, 6, 8, 10]
String ํ์
์ผ๋ก ๋ณํํ๊ธฐ
numsToStirng = nums.map({ (num: Int) -> String in
return "\(num)"
})
print(numsToStirng) // ["1", "2", "3", "4", "5"]
์ง์ง ๊ฐ๋จํ์ฃ ??
์์๋ค์ ๊ณ์ ๋ณด๊ณ , ์ง์ ๋ช ๋ฒ ์ณ๋ณด๋ฉด
๊ธ๋ฐฉ ์ดํดํ ์ ์์๊ฑฐ์์!
filter
filter๋ ๊ธฐ์กด ์ปจํ
์ด๋์ ์์์ ๋ํด์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฐ์ ์๋ก์ด ์ปจํ
์ด๋๋ก ๋ฐํํด์ฃผ๋ ํจ์์์.
(์ปจํ
์ด๋: Array, Set, Dictonary์ ๊ฐ์ ๋ฐ์ดํฐ ํ์
)
๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ๋ก ์์๋ก ์ดํดํด๋ด
์๋ค!
1 ~ 10์ ์ซ์์์ ํ์๋ง ๊ฑธ๋ฌ๋ด์ ๋ฐฐ์ด์ ๋ด๊ธฐ๋ฅผ
๋จผ์ if ์กฐ๊ฑด๋ฌธ์ ํ์ฉํด์ ๋ง๋ค์ด๋ณผ๊ฒ์!
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
var oddNumbers: [Int] = []
for number in numbers {
if number % 2 != 0 {
oddNumbers.append(number)
}
}
print(oddNumbers) // [1, 3, 5, 7, 9]
์ด์ filter๋ฅผ ํ์ฉํด๋ณผ๊ฒ์.
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let oddNumbers = numbers.filter { $0 % 2 != 0 }
print(oddNumbers) // [1, 3, 5, 7, 9]
์ง์ง ๊ฐ๋จํด์ก์ฃ ?
filter { ์กฐ๊ฑด } ๋ง ์จ์ฃผ๋ฉด,
์์ ์ ์ธํ ์์์ ์กฐ๊ฑด์ ํด๋นํ๋ ๊ฐ์ ๋ฐํํด์ค๋๋ค!
์์๋ฅผ ํ๋ ๋ ๋ค์ด๋ณผ๊ฒ์.
String ๋ฐฐ์ด์์ 3๊ธ์์ธ String๋ง ์ถ์ถํ๋ String ๋ฐฐ์ด์ ๋ง๋ค์ด๋ณผ๊ฒ์!
์ด๋ฒ์๋ if ์กฐ๊ฑด๋ฌธ์ ๋จผ์ ํ์ฉํด๋ณผ๊ฒ์.
let baoFamily = ["ํธ๋ฐ์ค", "์์ด๋ฐ์ค", "๋ฌ๋ฐ์ค", "๋ฃจ์ด๋ฐ์ค", "ํ์ด๋ฐ์ค"]
var threeLetterBaos: [String] = []
for baos in baoFamily {
if baos.count == 3 {
threeLetterBaos.append(baos)
}
}
print(threeLetterBaos) // ["ํธ๋ฐ์ค", "๋ฌ๋ฐ์ค"]
์ด์ filter๋ฅผ ํ์ฉํด๋ณผ๊ฒ์.
let baoFamily = ["ํธ๋ฐ์ค", "์์ด๋ฐ์ค", "๋ฌ๋ฐ์ค", "๋ฃจ์ด๋ฐ์ค", "ํ์ด๋ฐ์ค"]
let baos = baoFamily.filter { $0.count == 3 }
print(baos) // ["ํธ๋ฐ์ค", "๋ฌ๋ฐ์ค"]
๊ฐ๋จํ์ฃ ??โบ๏ธ
์ด๋ ๊ฒ filter๋ ์กฐ๊ฑด์ ํด๋นํ๋ ๊ฐ์ ์๋ก์ด ์ปจํ
์ด๋๋ก ๋ฐํํด์ฃผ๊ธฐ ๋๋ฌธ์
์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ๋, ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์์ด์ใ
ใ
reduce
reduce๋ ์ ์ํ ํด๋ก์ ๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์กด์ ์ปจํ
์ด๋ ์์๋ฅผ ๊ฒฐํฉํด์ ๋ฐํํด์ฃผ๋ ํจ์์์.
(์ปจํ
์ด๋: Array, Set, Dictonary์ ๊ฐ์ ๋ฐ์ดํฐ ํ์
)
๋ค์๋งํด
๋ ๊ฐ์ ์์๋ค์ ํ๋์ฉ ๋ฐ๋ณต์ ์ผ๋ก ์ฐ์ฐํ๋ ๊ณ ์ฐจํจ์์์!
์ด ๋
์์ ์ด๊ธฐ๊ฐ์ ์จ์ค์ผํฉ๋๋ค. (๊ธฐ์ตํ๊ธฐ!)
์๋ฅผ ๋ค์ด๋ณผ๊ฒ์!
1 ~ 10๊น์ง์ ๊ฐ ์์์ ํฉ์ ๊ตฌํด๋ณผ๊ฒ์.
์ญ์๋ for๋ฌธ์ผ๋ก ๋จผ์ ๋ง๋ค์ด๋ณผ๊ฒ์!
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
var sum = 0
for number in numbers {
sum += number
}
print(sum) // 55
์ด์ reduce๋ฅผ ํ์ฉํด๋ณผ๊น์?
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let sum = numbers.reduce(0, +)
print(sum) // 55
์ด๋ ๊ฒ reduce(์ด๊ธฐ๊ฐ, ์ฐ์ฐ์)๋ง ์ ์ด์ฃผ๋ฉด ๋ผ์!
๋ํ๊ธฐ ๋ง๊ณ ๋ ๋ค๋ฅธ ์ฐ์ฐ์๋ ๊ฐ๋ฅํด์!
let numbers = [1, 2, 3, 4, 5]
var multiply = 1
for number in numbers {
multiply *= number
}
print(multiply) // 120
ํ์ง๋ง, ์ด๊ธฐ๊ฐ์ 1๋ก ๋ฐ๊ฟ์ฃผ์ด์ผ๊ฒ ์ฃ ?
(0์์ ๊ณฑํ๋ฉด 0์ด๋๊น!)
๋๊ฐ์ด reduce๋ฅผ ํ์ฉํด๋ณด๋ฉด?
let numbers = [1, 2, 3, 4, 5]
let multiply = numbers.reduce(1, *)
print(multiply) // 120
์์ ๋ง๋ ๋ํ๊ธฐ ๊ณฑํ๊ธฐ๋ฅผ ๋ ๊ฐ๋จํ๊ฒ ํด๋ณผ๊ฒ์!
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let sum = numbers.reduce(0) { $0 + $1 }
print(sum) // 55
let numbers = [1, 2, 3, 4, 5]
let mulitply = numbers.reduce(1) { $0 * $1 }
print(mulitply) // 55
์ด๋ ๊ฒ reduce(์ด๊ธฐ๊ฐ) { $0 (์ฐ์ฐ์) $1}
์ฌ์ฉํด์ฃผ์๋ฉด ๋ผ์!!
์ด์ฒ๋ผ reduce ํจ์๋ฅผ ํ์ฉํ๋ฉด ๋์ ๊ฐ์ ์ฉ์ดํ๊ฒ ๊ตฌํ ์ ์์ด์.
์ด๋ ๊ฒ map, filter, reduce ํจ์๋ฅผ ํ์ฉํ๋ฉด,
๊ทธ๋์ ์์ฃผ ์ฌ์ฉํด์๋ ๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ ๋ฑ์ ๋ณด๋ค ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค ์ ์์ ๊ฒ ๊ฐ๋ค์!
'Study > ํผ๊ณต' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[swift] ARC์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ (0) | 2024.04.30 |
---|---|
[Swift] Escaping Closure (2) | 2024.04.28 |
[Swift] Show Library ํ์ฉ (Navigation Bar, Label, Button, Text Field) (0) | 2024.04.07 |