Study/ํ˜ผ๊ณต

[Swift] ๊ณ ์ฐจํ•จ์ˆ˜(map, filter, reduce)

yeggrrr๐Ÿผ 2024. 4. 21. 19:33

 

๊ณ ์ฐจํ•จ์ˆ˜
(Higher-order Function)



 


"๊ณ ์ฐจํ•จ์ˆ˜๋ž€ ๋ฌด์—‡์ผ๊นŒ?๐Ÿคจ"



๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ์ธ์ž(๋งค๊ฐœ๋ณ€์ˆ˜)๋กœ ๋ฐ›๊ฑฐ๋‚˜
ํ•จ์ˆ˜์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.



์Œ..?๐Ÿง

ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›๊ณ .. ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค..?
ํด๋กœ์ €..?


๋งž์•„์š”..! ์ด๋…€์„๋„ ์ผ๊ธ‰๊ฐ์ฒด(first-class object)์™€ ์—ฐ๊ด€์ด ์žˆ์Šต๋‹ˆ๋‹ค!๐Ÿซข



์•ž์„œ ํ•œ ๋ฒˆ ๋” ์ •๋ฆฌํ–ˆ์—ˆ๋˜ ํด๋กœ์ €!

 

7์ฃผ์ฐจ_5์ผ์ฐจ_์•ฑ ๊ฐœ๋ฐœ ์ˆ™๋ จ_Closure(ํด๋กœ์ €)_๊ฐœ์ธ๊ณต๋ถ€_TIL

์˜ค๋Š˜์€ ํด๋กœ์ €์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•ด๋ดค๋‹ค. ์ด์ „์— ๊ณต๋ถ€ํ–ˆ์—ˆ๋Š”๋ฐ, ํ™•์‹คํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ„๊ฒŒ ์•„๋‹ˆ๋ผ์„œ ๋ง‰์ƒ ํด๋กœ์ €์— ๋Œ€ํ•ด์„œ ๋ง๋กœ ์„ค๋ช…ํ•˜๋ ค๊ณ  ๋ณด๋‹ˆ ๊นŒ๋จน์€ ๊ฒƒ ๊ฐ™์•˜๋‹ค. (๊ณผ๊ฑฐ ํด๋กœ์ € ์ •๋ฆฌํ–ˆ๋˜ ๋‚ด ์ž

yegenie-coding.tistory.com

 

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 ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋ฉด,
๊ทธ๋™์•ˆ ์ž์ฃผ ์‚ฌ์šฉํ•ด์™”๋˜ ๋ฐ˜๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ ๋“ฑ์„ ๋ณด๋‹ค ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋„ค์š”!


 

728x90

'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