학습
Swift 함수형 프로그래밍 패턴
Swift 함수형 프로그래밍 패턴 — 중급
함수형 프로그래밍 패턴
1. 도입 (왜 배워야 하는가)
함수형 프로그래밍은 코드의 재사용성과 가독성을 크게 향상시키는 강력한 프로그래밍 패러다임입니다. Swift는 객체지향 프로그래밍을 기본으로 하지만, 함수형 프로그래밍의 요소를 통해 더욱 깔끔하고 효율적인 코드를 작성할 수 있습니다. 실무에서는 데이터의 변형이나 필터링, 집계 작업을 자주 수행하는데, 이러한 작업을 함수형 프로그래밍 패턴을 통해 간결하게 처리할 수 있습니다.
만약 함수형 프로그래밍 패턴을 모르고 코드를 작성한다면, 복잡한 로직이 반복되고 가독성이 떨어지며, 디버깅이 어려워질 수 있습니다. 또한, 비즈니스 로직을 변경할 때마다 많은 부분을 수정해야 하는 비효율적인 상황이 발생할 수 있습니다.
2. 핵심 개념 설명
함수형 프로그래밍의 핵심 개념 중 몇 가지를 살펴보겠습니다.
| 개념 | 설명 |
|---|---|
| 고차 함수 | 함수를 인자로 받거나 함수를 반환하는 함수. |
| 불변성 | 데이터는 변경되지 않으며, 새로운 데이터를 생성하여 반환하는 방식. |
| 순수 함수 | 동일한 입력에 대해 항상 동일한 출력을 반환하며, 부작용이 없는 함수. |
비유 설명
- 고차 함수: 요리를 할 때, 요리사가 조리 방법(함수)을 다른 요리사에게 전달하는 것과 같으며, 그 요리사도 새로운 요리를 만들 수 있습니다.
- 불변성: 레고 블록을 조립할 때, 기존 블록을 부수지 않고 새로운 블록을 추가하여 형태를 바꾸는 것과 비슷합니다.
- 순수 함수: 친구에게 항상 같은 레시피를 주면, 친구가 그 레시피로 요리를 할 때마다 같은 맛의 요리를 얻는 것과 같습니다.
3. 기본 코드 예제
다음은 고차 함수를 사용하는 간단한 예제입니다.
func applyFunction(to number: Int, using function: (Int) -> Int) -> Int {
return function(number)
}
let square: (Int) -> Int = { $0 * $0 }
let result = applyFunction(to: 5, using: square)
// result는 25가 됩니다.
실행 결과: result는 25가 됩니다.
applyFunction 함수는 두 개의 매개변수를 받습니다. 첫 번째는 정수이고, 두 번째는 정수를 입력받아 정수를 반환하는 함수입니다.square는 입력값을 제곱하는 함수입니다.applyFunction을 호출하면서 5와 square 함수를 전달하고, 결과로 25가 반환됩니다.4. 실전 활용 예제
1. 필터링 데이터
쇼핑몰에서 사용자가 선택한 상품들 중에서 가격이 10000원 이상인 상품만 필터링하는 상황을 가정해 봅시다.
struct Product {
let name: String
let price: Int
}
let products = [
Product(name: "신발", price: 50000),
Product(name: "모자", price: 15000),
Product(name: "양말", price: 5000)
]
let filteredProducts = products.filter { $0.price >= 10000 }
// filteredProducts는 신발과 모자를 포함합니다.
2. 매핑 데이터
사용자의 배송 주소를 기반으로 배송비를 계산하는 예제입니다.
struct Address {
let name: String
let deliveryFee: Int
}
let addresses = [
Address(name: "서울", deliveryFee: 3000),
Address(name: "부산", deliveryFee: 5000),
Address(name: "제주", deliveryFee: 7000)
]
let deliveryFees = addresses.map { $0.deliveryFee }
// deliveryFees는 [3000, 5000, 7000]이 됩니다.
5. 흔한 실수와 주의사항
실수 1: 함수의 부작용
var count = 0
func increment() {
count += 1 // 부작용 발생
}
increment()
// 이 함수는 count 변수를 변경하므로 순수 함수가 아닙니다.
올바른 코드:
func increment(by value: Int) -> Int {
return value + 1 // 부작용 없음
}
let newCount = increment(by: count)
// newCount는 count + 1을 반환합니다.
실수 2: 불변성의 무시
var numbers = [1, 2, 3]
func addNumber(_ num: Int) {
numbers.append(num) // 원본 배열을 수정
}
addNumber(4)
// numbers는 [1, 2, 3, 4]로 수정됩니다.
올바른 코드:
func addNumber(to list: [Int], number: Int) -> [Int] {
return list + [number] // 새로운 배열 반환
}
let newNumbers = addNumber(to: numbers, number: 4)
// newNumbers는 [1, 2, 3, 4]가 됩니다.
6. 정리
- 함수형 프로그래밍은 코드의 재사용성과 가독성을 향상시킵니다.
- 고차 함수, 불변성, 순수 함수는 함수형 프로그래밍의 핵심 개념입니다.
- 데이터의 필터링과 매핑은 실무에서 자주 사용되는 패턴입니다.
- Swift의 Combine 프레임워크를 통한 반응형 프로그래밍
- 비동기 프로그래밍 패턴과 async/await 사용법