###### tags: `2020 Boostcamp`
# Day06-학습정리
### 스스로 확인할 사항
- **함수와 클로저 closure에 대한 정의를 비교해보고, 클로저 선언이나 축약 표현에 대해 학습하고 정리한다.**
- 클로저
- C 언어나 Objective-C의 블록, 또는 람다와 유사함
- 일정 기능을 하는 코드를 하나의 블록으로 모아놓은 것
- 함수는 클로저의 형태 중 하나이다❗️
- 형태
> * 이름이 있으면서 어떤 값도 획득하지 않는 전역함수의 형태
> * 이름이 있으면서 다른 함수 내부의 값을 획득할 수 있는 중첩된 함수의 형태
> * 이름이 없고 주변 문맥에 따라 값을 획득할 수 있는 축약 문법으로 작성한 형태
- Example
```swift
// Basic expression
{ (매개변수 목록) -> 반환타입 in
실행 코드
}
// 클로저 매개변수를 갖는 함수
func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
return method(a, b)
}
// 후행 클로저
result = calculate(a: 10, b: 10) { (left: Int, right: Int) -> Int in
return left + right
}
// 단축 인자이름
result = calculate(a: 10, b: 10) {
return $0 + $1
}
// 암시적 반환 표현
result = calculate(a: 10, b: 10) { $0 + $1 }
```
- **본인 코드에 순수함수 pure function와 그렇지 않은 함수를 분류하고 정리한다.**
\- ClassifierAlpha class와 PrimeAlpha class를 봤을 때, init 에서 number가 초기화 되고 난 뒤 읽기만 한다. 또한 클레스 메서드 들은 이 number 값만을 가지고 결과를 return한다. 따라서 안에 있는 모든 함수가 같은 input에 대해 항상 같은 output을 내기 때문에 모두 pure function이라 할 수 있다.
- **본인이 사용하지 않은 고차 함수 higher-order function에 대해 (적어도 3개 이상) 추가적으로 학습하고 예제 코드를 만들고 정리한다.**
- CompactMap - Map과 똑같지만 optional handling이 가능하다
```swift
let possibleNumbers = ["1", "2", "three", "////4////", "5"]
let mapped = possibleNumbers.map { str in Int(str) } // [1, 2, nil, nil, 5]
let compactMapped = possibleNumbers.compactMap { str in Int(str) } // [1, 2, 5]
```
- Sort(Sorted) - Comparable protocol을 따르는 mutable collection의 요소를 정렬한다
```swift
var names = ["Stefano", "Brain", "John", "Kate", "Luca", "Zoe"]
names.sort() // ["Brain", "John", "Kate", "Luca", "Stefano", "Zoe"]
names.sort(by: >) // ["Zoe", "Stefano", "Luca", "Kate", "John", "Brain"]
```
- Contains - 주어진 Predicate을 만족시키는 요소가 있는지 여부를 반환한다
```swift
var names = ["Stefano", "Brain", "John", "Kate", "Luca", "Zoe"]
names.contains { $0.first == "A"} // false
names.contains { $0.first == "S"} // true
```
- Partition - 주어진 Predicate을 기준으로 collection의 요소들을 재배치한다
```swift
var numbers = [30, 40, 20, 30, 30, 60, 10]
let pivot = numbers.partition(by: { $0 > 30 })
// pivot == 5 (조건에 부합하게 partition이 된 index)
// numbers == [30, 10, 20, 30, 30, 60, 40]
```
### 다같이 확인할 사항
- **객체지향 코드가 읽기 편한가, 함수형 코드가 읽기 편한가 서로의 코드를 보고 자신의 기준에서 토론한다.**
1. 객체지향 코드
* 추상화가 바탕이 되므로 가독성이 비교적 뛰어나다
* 흐름을 파악하기에 용이하다
2. 함수형 코드
* 함수형 페러다임에 익숙하지 않다면 코드 해석 자체가 불가할 것 같다(고차함수, 클로저, 합성함수 등)
* 난해한 느낌을 받을 수 있다
- **객체지향 패러다임과 함수형 패러다임 공통점과 차이점을 토론한다.**
| | 객체지향 | 함수형 |
| :-------: | :------------: | :-------: |
| 일급 객체 | 클래스(Object) | 함수 자체 |
| 패러다임 | 명령형 | 선언형 |