본문 바로가기
카테고리 없음

13. 고차 함수(map, filter, reduce)

by swifttt 2025. 4. 2.

 

Swift에서는 함수도 일급 객체로 다루어지며, 함수를 매개변수로 전달하거나 반환할 수 있습니다.
이러한 특성을 활용한 대표적인 기능이 고차 함수(Higher-Order Functions)입니다.

Swift의 컬렉션 타입(Array, Dictionary 등)은 map, filter, reduce 등의 고차 함수를 기본적으로 제공합니다.
이 함수들을 활용하면 복잡한 반복 로직을 간결하고 선언적으로 작성할 수 있습니다.

1. map 함수

map은 컬렉션의 각 요소에 대해 동일한 연산을 수행하고, 변환된 결과를 새 컬렉션으로 반환합니다.

let numbers = [1, 2, 3, 4, 5]
let squared = numbers.map { $0 * $0 }
print(squared) // [1, 4, 9, 16, 25]

각 요소를 제곱하여 새로운 배열을 생성하였습니다.

map은 배열 뿐만 아니라 Set, Dictionary에서도 사용할 수 있습니다.

let names = ["kim", "lee", "park"]
let capitalized = names.map { $0.uppercased() }
print(capitalized) // ["KIM", "LEE", "PARK"]

2. filter 함수

filter는 조건에 맞는 요소만 걸러서 새로운 컬렉션을 반환합니다.

let numbers = [1, 2, 3, 4, 5, 6]
let even = numbers.filter { $0 % 2 == 0 }
print(even) // [2, 4, 6]

조건을 만족하는 요소만 남기기 때문에, 불필요한 값을 제거하는 데 유용합니다.

문자열 배열에서도 활용할 수 있습니다.

let words = ["apple", "banana", "kiwi"]
let filtered = words.filter { $0.count > 5 }
print(filtered) // ["banana"]

3. reduce 함수

reduce는 배열의 모든 요소를 하나의 값으로 합치는 함수입니다.
초기값을 기준으로 왼쪽부터 순차적으로 연산을 수행합니다.

let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0) { $0 + $1 }
print(sum) // 15

초기값이 0이고, 그 이후 각각의 값을 더해서 하나의 합을 반환합니다.

곱셈도 가능합니다.

let product = numbers.reduce(1) { $0 * $1 }
print(product) // 120

문자열 연결에도 사용할 수 있습니다.

let words = ["Swift", "is", "fun"]
let sentence = words.reduce("") { $0 + " " + $1 }
print(sentence) // " Swift is fun"

4. map, filter, reduce의 조합

이 세 가지는 서로 조합하여 사용하는 경우가 많습니다.

let numbers = [1, 2, 3, 4, 5, 6]
let result = numbers
    .filter { $0 % 2 == 0 }
    .map { $0 * $0 }
    .reduce(0) { $0 + $1 }

print(result) // 56 (2^2 + 4^2 + 6^2)

이처럼 단순한 로직을 체이닝 형태로 깔끔하게 표현할 수 있습니다.

마무리

고차 함수인 map, filter, reduce는 반복문보다 더 선언적이고 간결한 코드를 작성할 수 있게 해줍니다.
Swift 컬렉션에서 이 함수들을 자유자재로 활용하면, 복잡한 데이터 처리 로직도 간단하게 구현할 수 있습니다.
코드의 가독성과 생산성을 높이기 위해, 이 세 가지 함수의 개념과 사용법을 반드시 익혀두는 것이 좋습니다.