[Swift] ์ค์ํํธ์ ๊ณ ์ฐจํจ์๋ค(High Order Functions)
๊ณ ์ฐจ ํจ์ (High Order Function)
๊ณ ์ฐจํจ์๋ ๋ค๋ฅธ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๊ฑฐ๋, ํจ์์ ๊ฒฐ๊ณผ๋ก ํจ์๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ค์ํํธ์์๋ map, filter, reduce ๊ฐ ์ฝ๋ ์ ํ์ ๋ด์ ์ ์๋์ด ์์ต๋๋ค.
์ง์ง ์์ฃผ์ฐ๋ ๊ณ ์ฐจํจ์๋ค(map, filter, reduce)
map
map ์ ์ฝ๋ ์ ๋ด๋ถ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ์ฌ ์๋ก์ด ์ฝ๋ ์ ์ ์์ฑํฉ๋๋ค.
let numbers = [1, 2, 3, 4, 5]
let numbersPlusOne = numbers.map({ $0 + 1 })
map ๋ฉ์๋๋ ์ธ์๋ก ํด๋ก์ ๋ฅผ ๋ฐ์ ์ปจํ ์ด๋ ๋ด๋ถ์ ๋ค์ด์๋ ์์๋ค์ ๊ฐ์ ์ด๋ป๊ฒ ๋ฐ๊ฟ ๊ฒ์ธ์ง ๊ฒฐ์ ํฉ๋๋ค.
filter
filter ๋ ์ฝ๋ ์ ๋ด๋ถ์์ ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ค๋ง ๊ณจ๋ผ ์๋ก์ด ์ฝ๋ ์ ์ ์์ฑํฉ๋๋ค.
let numbers = [1, 2, 3, 4, 5]
let numbersGreaterThanTwo = numbers.filter({ $0 > 2 })
filter ๋ฉ์๋๋ ํด๋ก์ ๋ฅผ ์ธ์๋ก ๋ฐ๊ณ , ์ด ํด๋ก์ ๋ด๋ถ์๋ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ํฌํจ์ํฌ์ง ๊ทธ ์กฐ๊ฑด์ ์ ์ํฉ๋๋ค.
reduce
reduce ๋ ์ฝ๋ ์ ๋ด๋ถ์ ๋ฐ์ดํฐ๋ค์ ํ๋๋ก ํตํฉ์ํต๋๋ค.
let numbers = [1, 2, 3, 4, 5]
let numberSum = numbers.reduce(0, { $0 + $1 })
let numberSumShortcut = numbers.reduce(0, +)
๋ค๋ฅธ ๊ณ ์ฐจํจ์๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ reduce๋ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค. ์ฒซ๋ฒ์จฐ ์ธ์๋ ํตํฉํ ๋ฐ์ดํฐ์ ์ด๊ธฐ ๊ฐ์ ๋๋ค. ์ ์์ ์์๋ ๋ฐฐ์ด ๋ด์ ๋ชจ๋ ์ ์๋ค์ ํฉ์ ๊ตฌํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด๊ธฐ๊ฐ์ผ๋ก 0์ ์ง์ ํด์ฃผ์์ต๋๋ค. ๋๋ฒ์งธ ์ธ์๋ ํด๋ก์ ์ธ๋ฐ, ์ด ํด๋ก์ ์์๋ ์ด๋ป๊ฒ ๊ฐ์ ํตํฉํ ๊ฒ์ธ์ง๋ฅผ ์ ์ํฉ๋๋ค. ์ด๋ ์ฌ์ฉ๋๋ ๋ ํ๋ผ๋ฏธํฐ ์ค ์ฒซ๋ฒ์งธ๋ ๋ฐ๋ก ์ด์ ๊ฐ์ ๋ํ ํตํฉ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๊ณ , ๋๋ฒ์งธ๋ ์ด๋ฒ์ ์๋ก ํตํฉํ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํฉ๋๋ค.
์ค์ํํธ์์๋ ์ฌ์น์ฐ์ฐ์๋ ํจ์(ํด๋ก์ )์ด๋ฏ๋ก ์ฐ์ฐ์๋ง ๋ฃ์ด์ฃผ์ด๋ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค!
๊ณ ์ค๊ธ ๊ณ ์ฐจํจ์๋ค(CompactMap, FlatMap, ForEach)
CompactMap
์ค์ํํธ์์๋ ์ธ ๊ฐ์ง ๋ค๋ฅธ ์ข ๋ฅ์ Map ๊ณ ์ฐจํจ์๋ฅผ ์ง์ํฉ๋๋ค. ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ map๊ณผ compactMap, flatMap์ด ์์ต๋๋ค. ๊ทธ ์ค compactMap์ ์ต์ ๋ ๋ฐ์ธ๋ฉ์ ์ง์ํ๋ map์ ๋๋ค.
let students : [String?] = ["Mike", "Jane", nil, "John", nil]
์์ ๊ฐ์ด nil์ด ์์ฌ ์๋ ์ฝ๋ ์ ์์ ์กด์ฌํ๋ ๋ชจ๋ ์ด๋ฆ ์์ "Boost2021-" ์ด๋ผ๋ ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ๊ณ ์ถ๋ค๊ณ ํด๋ด ์๋ค. ๋จ์ํ map ์ ํตํด ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์ง ๋ค๋ฉด
let students : [String?] = ["Mike", "Jane", nil, "John", nil]
let boostStudents = students.map({ "BoostCamp2021" + $0 })
๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
students ๋ฐฐ์ด ๋ด๋ถ์ ์๋ ๋ฐ์ดํฐ๋ค์ ๋ชจ๋ ์ต์ ๋ํ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ง์ฝ ์ฌ๊ธฐ์ ์ต์ ๋ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ๋ณต์กํ ์ฝ๋๋ฅผ ๋ง๋ค์ด์ผํฉ๋๋ค.
let students : [String?] = ["Mike", "Jane", nil, "John", nil]
let boostStudents = students.map({ student -> String? in
if let name = student {
return "BoostCamp2021-" + name
} else{
return nil
}
})
print(boostStudents) // [Optional("BoostCamp2021-Mike"), Optional("BoostCamp2021-Jane"), nil, Optional("BoostCamp2021-John"), nil]
ํ์ง๋ง compactMap์ ์ฌ์ฉํ๋ฉด ์ต์ ๋ ๋ฐ์ธ๋ฉ์ ํ๋ฉด์ ๋์์ nil ๊ฐ์ ์ ์ธํ ์๋ก์ด ์ฝ๋ ์ ์ ๋ง๋ค์ด๋ผ ์ ์์ต๋๋ค. ๋๋ฐ!
let students : [String?] = ["Mike", "Jane", nil, "John", nil]
let boostStudents = students.compactMap({ $0 }).map( {"BoostCamp2021-" + $0})
print(boostStudents) // ["BoostCamp2021-Mike", "BoostCamp2021-Jane", "BoostCamp2021-John"]
FlatMap
FlatMap์ 2์ฐจ์ ๋ฐฐ์ด์ ๋๋์ด์ ธ์๋ ๋ฐ์ดํฐ๋ค์ 1์ฐจ์ ๋ฐฐ์ด๋ก ํฉ์ณ์ฃผ๋ ๊ธฐ๋ฅ์ด ํฌํจ๋์ด ์์ต๋๋ค.
let students = [["Mike", nil], [nil, nil, "Jane"], ["John"]]
๋จผ์ ์์ ๊ฐ์ ๋ฐฐ์ด์ 1์ฐจ์์ผ๋ก ๋ง๋ค๊ณ ์ถ๋ค๋ฉด, ๋ค์์ฒ๋ผ ์์ฑํ ์ ์์ต๋๋ค.
let goodStudents = students.flatMap({$0})
print(goodStudents) // [Optional("Mike"), nil, nil, nil, Optional("Jane"), Optional("John")]
์์ง์ ์ต์ ๋ ๋ฐ์ธ๋ฉ์ด ์๋์ด ์๊ณ nil์ด ํฌํจ๋์ด ์์ต๋๋ค. ๋ง์ฝ ์ฌ๊ธฐ์ ์ค์ ์ด๋ฆ๋ค๋ง ๋ฝ์๋ด๊ณ ์ถ๋ค๋ฉด compactMap๊ณผ ์ฎ์ด์ ์ฌ์ฉํ๋ฉด ๋๊ฒ ์ฃ
let goodStudents = students.flatMap({$0}).compactMap({ $0 })
print(goodStudents) // ["Mike", "Jane", "John"]
ForEach
forEach๋ for-in ๊ตฌ๋ฌธ์ฒ๋ผ ์ฝ๋ ์ ์ ๊ฐ ์์๋ค์ ๋ฝ์๋ผ ์ ์์ต๋๋ค. for-in ๊ณผ๋ ๋ค๋ฅด๊ฒ ๊ณ ์ฐจํจ์์ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ๊ธ๋ก๋ฒ ์ค์ฝํ์์ ์ฌ์ฉํ์ ๋๋ return ์ ํตํด ํ์ฌ ๋ฐ๋ณต์ ์ข ๋ฃํ๊ณ ๋ค์ ๋ฐ๋ณต์ผ๋ก ์ด์ด๋๊ฐ ์ ์์ต๋๋ค. ๋ง์น continue์ฒ๋ผ ๋์ํฉ๋๋ค. forEach๋ ๋ค๋ฅธ ๊ณ ์ฐจํจ์์ฒ๋ผ ์๋ก์ด ์ฝ๋ ์ ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ์ง ์๊ธฐ ๋๋ฌธ์ ๋จ์ํ ์ํ์ ์ฉ๋๋ก ์ฌ์ฉํ๊ธฐ์ ์ ํฉํฉ๋๋ค.
let numbers = [1, 2, 3, 4, 5]
numbers.forEach({
print($0)
})
//1
//2
//3
//4
//5
๊ณ ์ฐจํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋ ๊ฐ๋ ์ฑ์ด ์์ฃผ์์ฃผ ์ข์์ง๊ณ , ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํน์ ์ ์ซ๊นํจ(?)์ ๋๋ ์ ์์ต๋๋ค..! ์์ ์ต๊ฒ ๊ธฐํ๊ฐ ๋ ๋๋ง๋ค ์์ฃผ ์ฌ์ฉํด๋ด์ผ๊ฒ ์ด์! ๋ฌด์ง์ฑ for ๊ธ์ง!
'๐ ์์ด-์ค-์์ค > ๐ค ์ค์ํํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฉด์ ์ง๋ฌธ] ์ค์ํํธ(Swift) 75๋ฌธ 75๋ต (2) | 2021.12.24 |
---|---|
[Swift] GCD(Grand Central Dispatch) - Dispatch Queue (2) | 2021.10.25 |
[Swift] Swift์ ์ฐ์ฒด๊ตญ, NotificationCenter (0) | 2021.09.19 |
[Swift] Struct vs. Class (2), Struct์์ ์ฐธ์กฐ ํ์ , Class ์์ ๊ฐ ํ์ ๋ณ์๊ฐ ์์ ๋ (0) | 2021.08.26 |
[Swift] Struct vs. Class (1), ์ธ์ ๋ญ ์จ์ผํ ๊น? (0) | 2021.08.25 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote