|
| 1 | +함수형 프로그래밍은 자료처리를 `수학적 함수( f(x)=y )의 계산`으로 취급하고 **상태와 데이터 변경을 피하는 프로그래밍 패러다임**의 하나입니다. |
| 2 | + |
| 3 | +Swift에서 `함수형 프로그래밍`이란 데이터를 다룰 때 `var` 대신 `let`을 사용하는 것을 의미합니다. 이것은 주로 `함수형 코드`가 `명령형 코드`보다 버그가 적고 이해하기 쉽다는 이점이 있습니다. `명령형 프로그래밍`은 `함수형 프로그래밍`의 반대이고, **프로그램의 상태를 변경하는 명령문을 사용하는 패러다임**입니다. |
| 4 | + |
| 5 | +함수형 프로그래밍의 핵심은 코드를 프로젝트 전체에서 `여러 번 사용할 수 있는` 더 작고 `pure functions`으로 나누는 것입니다. `Pure function`은 프로그램 전체에 `side effects가 없는` 함수입니다. 즉, 프로그램에 참여하는 다른 함수를 돕기 위해 존재한다는 의미입니다. |
| 6 | + |
| 7 | +명령형 프로그래밍으로 문제를 어떻게 문제를 해결하는지 보고, 함수형 프로그래밍에서는 그 문제를 어떻게 해결할 수 있는지 예시로 확인하겠습니다. |
| 8 | + |
| 9 | +명령형 프로그래밍 예시 |
| 10 | +```swift |
| 11 | +let numbers = [1, 2, 3, 4, 5] |
| 12 | +var evenNumbers = [Int]() |
| 13 | + |
| 14 | +for i in 0..<numbers.count { |
| 15 | + let number = numbers[i] |
| 16 | + if number % 2 == 0 { |
| 17 | + evenNumbers.append(number) |
| 18 | + } |
| 19 | +} |
| 20 | +``` |
| 21 | +numbers 배열에서 짝수만 추출해서 evenNumbers에 저장하는 과정입니다. |
| 22 | + |
| 23 | +함수형 프로그래밍 예시 |
| 24 | +```swift |
| 25 | +let evenNumbers = [1, 2, 3, 4, 5].filter { (number) -> Bool in |
| 26 | + if number % 2 == 0 { |
| 27 | + return true |
| 28 | + } else { |
| 29 | + return false |
| 30 | + } |
| 31 | +} |
| 32 | + |
| 33 | +// 더 짧은 구현 |
| 34 | +let evenNumbers = [1, 2, 3, 4, 5].filter { $0 % 2 == 0 } |
| 35 | +``` |
| 36 | + |
| 37 | +우리는 본질적으로 8줄의 코드를 1줄로 바꿨고, 코드가 가독성있고 이해하기 쉽게 만들었습니다. |
| 38 | + |
| 39 | +다른 예시도 있습니다. |
| 40 | +`map`과 `compactMap` 함수가 있습니다. |
| 41 | +`map`은 각 요소를 연산해서 새로운 array를 리턴하는 함수입니다. `nil`을 포함하기 때문에 옵셔널 값을을 포함합니다. |
| 42 | +`compactMap`은 `map`과 비슷하지만 `nil`을 포함하지 않습니다. 그래서 옵셔널 값을 포함하지 않습니다. |
| 43 | + |
| 44 | +코드는 다음과 같습니다. |
| 45 | +```swift |
| 46 | +let arrayWithOptionals = ["1", "two", "3"].map { Int($0) } |
| 47 | +print(arrayWithOptionals) // [Optional(1), nil, Optional(3)] |
| 48 | + |
| 49 | +let arrayWithNoOptionals = ["1", "two", "3"].compactMap { Int($0) } |
| 50 | +print(arrayWithNoOptionals) // [1, 3] |
| 51 | +``` |
| 52 | + |
| 53 | +<br> |
| 54 | + |
| 55 | +※ 참고출처 |
| 56 | +[민소네](http://minsone.github.io/programming/functional-programming-with-example-in-swift) |
| 57 | +[sdrzn](https://medium.com/@sdrzn/functional-programming-in-swift-221a8cabb8c) |
0 commit comments