๐ ๊ณ ์ฐจํจ์
Map
Filter
Reduce
๊ณ ์ฐจํจ์๋ ?
๋ค๋ฅธ ํจ์๋ฅผ ์ ๋ฌ์ธ์๋ก ๋ฐ๊ฑฐ๋ ํจ์์คํ์ ๊ฒฐ๊ณผ๋ฅผ ํจ์๋ก ๋ฐํํ๋ ํจ์
( = ๋งค๊ฐ๋ณ์๋ก ํจ์๋ฅผ ๊ฐ๋ ํจ์ )
Map ( ๋ณํ )
๋ฐ์ดํฐ๋ฅผ ๋ณํํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค.
๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๋ณํํ์ฌ ์๋ก์ด ์ปจํ ์ด๋๋ฅผ ๋ง๋๋๋ฐ, ๊ธฐ์กด ๋ฐ์ดํฐ๋ ๋ณํ๋์ง ์๋๋ค.
Map์ ๊ธฐ์กด์ for-in ๊ตฌ๋ฌธ๊ณผ ํฐ ์ฐจ์ด๊ฐ ์์ง๋ง, ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ด ์๋ค.
- ์ฝ๋์ ๊ฐ๊ฒฐ์ฑ
- ์ฌ์ฌ์ฉ ์ฉ์ด
- ์ปดํ์ผ๋ฌ ์ต์ ํ ์ฑ๋ฅ ์ข์
map์ ๊ธฐ๋ณธ ํํ
array.map(transform:T throws -> T)
Tํ์ ์ transform์ ๋ฐ์ ์๋ก์ด Txใ ์ ์ ์ปจํ ์ด๋๋ฅผ ์์ฑํ๋ค๋ ๋ง์ด๋ค.
* ๊ธฐ์กด for - in ๊ตฌ๋ฌธ
let numArray = [1,3,5,7,9]
var multiArray = [Int]()
for num in numArray {
multiArray.append(num*2)
}
print(multiArray) // [2,6,10,14,18]
* map ์ฌ์ฉ์
let numArray = [1,3,5,7,9]
let multiArray = numArray.map { $0 * 2 }
print(multiArray) // [2,6,10,14,18]
์ด๋ ๊ฒ ์ฝ๋๋ฅผ ํจ์ฌ ์งง๊ฒ ํ ์ ์๋ค.
์ ์ ๋ ๋ง์ ์ฐ์ฐ๊ณผ ๋ค์ํ ์กฐ๊ฑด์ด ๋ค์ด๊ฐ๋ฉด for-in๋ณด๋ค map์ด ๊ฐ๊ฒฐํ๊ณ ํธํ๋ค๋๊ฒ์ ๋๋ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ฌ map์ ์ฝ๋๋
let numArray [ 1,3,5,7,9]
let multiArray = numArray.map({ (number:Int) -> Int in
return number*2
})
print(multiArray) // [2,6,10,14,18]
์ ์ฝ๋์์ ๋งค๊ฐ๋ณ์, ๋ฐํํ์ , ๋ฐํ ํค์๋(return)์ ์๋ต(์ถ์ฝ)ํ ํํํด๋ก์ ์ธ ๊ฒ์ด๋ค.
Filter ( ์ถ์ถ )
filter๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค. ๊ธฐ์กด ์ปจํ ์ด๋์์ ๋ด๋ถ์ ๊ฐ์ ๊ฑธ๋ฌ ์๋ก์ด ์ปจํ ์ด๋์ ๊ฐ์ ๋ด์ ๋ฐํํด์ค๋ค.
map์ฒ๋ผ ๊ธฐ์กด ์ฝํ ์ธ ๋ฅผ ๋ณํํ๋ ๊ฒ์ด ์๋๋ผ, ํน์ ์กฐ๊ฑด์ ๋ง๊ฒ ๊ฑธ๋ฌ๋ด๋ ์ญํ ์ด๋ค.
filterํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋๋ ํจ์์ ๋ฐํ ํ์ ์ Bool์ด๋ค. ํด๋น ์ฝํ ์ธ ์ ๊ฐ์ ๊ฐ๊ณ ์๋ก์ด ์ปจํ ์ด๋์ ํฌํจ๋ ํญ๋ชฉ์ด๋ผ๊ณ ํ๋จํ๋ฉด true, ํฌํจํ์ง ์์ผ๋ ค๋ฉด false๋ฅผ ๋ฐํํด์ฃผ๋ฉด ๋๋ค.
filter ๋ํ map๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก for-in ๊ตฌ๋ฌธ๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.
filter์ ๊ธฐ๋ณธ ํํ
array.filter(isInlcuded:T throws -> T)
Tํ์ ์ isIncluded๋ฅผ ๋ฐ์ ์๋ก์ด Tํํ์ ์ปจํ ์ด๋๋ฅผ ์์ฑํ๋ค.
* ๊ธฐ์กด for - in ๊ตฌ๋ฌธ
let stringArray = ["๊ฐ์", "๋ํต๋ น", "๊ฐ๋ฐ์", "์ ์๋", "์์ฌ", "๊ฒ์ฌ", "๊ฑด๋ฌผ์ฃผ"]
var threeCountArray = [String]()
for st in stringArray {
if st.count == 3 {
threeCountArray.append(st)
}
}
print(threeCountArray) // ["๋ํต๋ น", "๊ฐ๋ฐ์", "์ ์๋", "๊ฑด๋ฌผ์ฃผ"]
* filter ์ฌ์ฉ์
let stringArray = ["๊ฐ์", "๋ํต๋ น", "๊ฐ๋ฐ์", "์ ์๋", "์์ฌ", "๊ฒ์ฌ", "๊ฑด๋ฌผ์ฃผ"]
let threeCountArray = stringArray.filter { $0.count == 3 }
print(threeCountArray) // ["๋ํต๋ น", "๊ฐ๋ฐ์", "์ ์๋", "๊ฑด๋ฌผ์ฃผ"]
์ ์ฝ๋๋ map ์์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋์ ์ฝ๋์์ ๋งค๊ฐ๋ณ์, ๋ฐํ ํ์ , ๋ฐํ ํค์๋(return)์ ์๋ตํ ํํํด๋ก์ ์ด๋ค.
let stringAttay = ["๊ฐ์", "๋ํต๋ น", "๊ฐ๋ฐ์", "์ ์๋", "์์ฌ", "๊ฒ์ฌ", "๊ฑด๋ฌผ์ฃผ"]
let threeCountArray = stringAttay.filter({ (value: String) -> Bool in
return value.count == 3
})
print(threeCountArray) // ["๋ํต๋ น", "๊ฐ๋ฐ์", "์ ์๋", "๊ฑด๋ฌผ์ฃผ"]
map๊ณผ filter์ ์ฐ๊ณ์ฌ์ฉ
let numbers: [Int] = [0, 1, 2, 3, 4, 5]
let mappedNumbers: [Int] = numbers.map{ $0 + 3 }
let evenNumbers: [Int] = mappedNumbers.filter{ (number: Int) -> Bool in
return number % 2 == 0
}
print(evenNumbers) // [4, 6, 8]
// mappedNumbers๋ฅผ ๊ตณ์ด ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ ํ์๊ฐ ์๋ค๋ฉด ๋ฉ์๋๋ฅผ ์ฒด์ธ์ฒ๋ผ ์ฐ๊ฒฐํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
let oddNumbers: [Int] = numbers.map{ $0 + 3 }.filter{ $0 % 2 == 1 }
print(oddNumbers) // [3, 5, 7]
Reduce ( ๊ฒฐํฉ )
reduce๋ ๋ฐ์ดํฐ๋ฅผ ํฉ์ณ์ฃผ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
๊ธฐ์กด ์ปจํ ์ด๋์์ ๋ด๋ถ์ ๊ฐ๋ค์ ๊ฒฐํฉํ์ฌ ์๋ก์ด ๊ฐ์ ๋ง๋ ๋ค.
reduce๋ฅผ ํ๋ฒ์ ์ดํดํ๊ธฐ์ ์ซ์ ํฉ ์์ ๊ฐ ์ต๊ณ ๋ผ ์ ๋ํ ํฉ ์์ ๋ฅผ ๋ง๋ค์ด ๋ณด์๋ค.
* ๊ธฐ์กด for-in ๊ตฌ๋ฌธ
let numberArray = [1,2,3,4,5]
var sum = 0
for number in numberArray {
sum += number
}
print(sum) // 15
* reduce ์ฌ์ฉ์
let numberArray = [1,2,3,4,5]
let sum = numberArray.reduce(0) { $0 + $1 }
print(sum) // 15
์ฝ๋ ์ค๋ช
1. reduce ํจ์๋ฅผ ํธ์ถํ ๋ ์ฌ์ฉํ๋ ์ด๊ธฐ๊ฐ์ 0์ผ๋ก ์ง์ . ์ด ์ด๊ธฐ๊ฐ์ ๋์ ์์ ์ ์์ํ ๋ ์ฌ์ฉ๋๋ฉฐ, ๋์ ๋ ๊ฒฐ๊ณผ์ ์ด๊ธฐ๊ฐ์ด๊ธฐ๋ ํ๋ค.
2. ํด๋ก์ { $0 + $1 }๋ reduceํจ์๊ฐ ๋ฐ๋ณตํ ๋๋ง๋ค ์คํ๋๋ ํด๋ก์ ์ด๋ค. $0์ ๋์ ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๊ณ , $1์ ๋ฐฐ์ด์ ๊ฐ ์์๋ฅผ ๋ํ๋ธ๋ค.
3. reduce ํจ์๋ ๋ฐฐ์ด์ ๊ฐ ์์์ ๋ํด ํด๋ก์ ๋ฅผ ์คํํ๊ณ , ์ด๊ธฐ๊ฐ์ธ 0์ ๋์ ๋ ๊ฒฐ๊ณผ๋ก ์ฌ์ฉํ๋ค.
4. ํด๋ก์ ๋ ๊ฐ ์์๋ฅผ ํ์ฌ ๋์ ๋ ๊ฒฐ๊ณผ์ ๋ํด์ฃผ๋ ์ฐ์ฐ์ ์ํํ๋ค. ์๋ฅผ ๋ค์ด, ์ฒ์์์ 0 + 1์ ๊ณ์ฐํ์ฌ ๊ฒฐ๊ณผ์ 1์ ๋์ ํ๋ค. ๊ทธ๋ผ ๋ค์ 1+2, 3+3, 6+4, 10+5 ์์๋ก ์งํํ๋ค.
5. reduce ํจ์๋ ๋ชจ๋ ์์๋ฅผ ์ฒ๋ฆฌํ ํ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
์ ์ฝ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋์ ์ฝ๋์์ ๋งค๊ฐ๋ณ์, ๋ฐํ ํ์ , ๋ฐํ ํค์๋(return)์ ์๋ตํ ํํ ํด๋ก์ ์ด๋ค.
let numberArray = [1,2,3,4,5]
let sum = numberArray.reduce(0, { (first: Int, second: Int) -> Int in
return first + second
})
print(sum) // 15
๐ ํ๋ก๊ทธ๋๋จธ์ค ๊ณ ์ฐจํจ์ ํ์ฉ ๋ฌธ์
Level 0
https://school.programmers.co.kr/learn/courses/30/lessons/181841
https://school.programmers.co.kr/learn/courses/30/lessons/181885
'๐ ์ฝ๋ฉํ ์คํธ > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ReplacingOccurrences ( ๋ฌธ์์ด ์นํ ) (0) | 2023.11.02 |
---|---|
[Swift] Split , Components (0) | 2023.11.02 |
[Swift] prefix suffix (0) | 2023.11.01 |
[Swift] String ๋ค์ํ ํจ์ ์ ๋ฆฌ (0) | 2023.10.27 |
[Swift] ๋ฐฐ์ด ๋ฉ์๋ sort() sorted() / reverse() reversed() (0) | 2023.10.18 |