|
| 1 | +# 어큐뮬레이터 |
| 2 | + |
| 3 | +## 개념 |
| 4 | + |
| 5 | +- 집합을 반복하여 하나의 결과를 만들어냄 |
| 6 | +- 배열 요소의 합산 같은 일반적 작업은 루프 대신 어큐뮬레이터로 구현 가능 |
| 7 | + |
| 8 | +## 재귀, 꼬리 호출 최적화 |
| 9 | + |
| 10 | +함수형 프로그래밍에서 재귀는 인기있는 방법이며 **꼬리 호출 최적화**를 제공함 - [꼬리호출 관련 링크](http://homoefficio.github.io/2015/07/27/%EC%9E%AC%EA%B7%80-%EB%B0%98%EB%B3%B5-Tail-Recursion/) |
| 11 | + |
| 12 | +- 이를 제공하는 언어는 스택 프레임이 재사용되는 재귀를 사용해 함수의 최적화를 제공 |
| 13 | + - 효율적, 대부분의 루프를 쉽게 교체할 수 있음 |
| 14 | + - 모든 JS 인터프리터에서 지원되지는 않지만 재귀는 사용 가능 |
| 15 | + |
| 16 | +## for 루프의 문제점 |
| 17 | + |
| 18 | +**문제** : for 루프를 통한 제어 흐름이 가변적 |
| 19 | + |
| 20 | +```js |
| 21 | +var result = ''; |
| 22 | +var multiArray = [[1,2,3], ['a', 'b', 'c']]; |
| 23 | +for(var i = 0; i < multiArray.length; i++){ |
| 24 | + for(var j = 0; i < multiArray[i].length; j++){ |
| 25 | + result += multiArray[i][j]; |
| 26 | + } |
| 27 | +} |
| 28 | + |
| 29 | +// 두번째 루프의 카운터에 문제가 있다! |
| 30 | + |
| 31 | +var result = ''; |
| 32 | +var multiArray = [[1,2,3], ['a', 'b', 'c']]; |
| 33 | +for(var i = 0; i < multiArray.length; i++){ |
| 34 | + for(var j = 0; j < multiArray[i].length; j++){ |
| 35 | + result += multiArray[i][j]; |
| 36 | + } |
| 37 | +} |
| 38 | +``` |
| 39 | + |
| 40 | +변수 이름을 잘 정하여 문제를 완화시킬 순 있지만, 우린 이를 완전 차단하여야 한다. |
| 41 | + |
| 42 | +웨스테로스의 예제로 돌아가 보자 |
| 43 | + |
| 44 | +## 구현 |
| 45 | + |
| 46 | +> 전쟁은 많은 비용이 들지만, 농민의 세금과 영주의 재정 지원이 있다. |
| 47 | +
|
| 48 | +```js |
| 49 | +const peasants = [ |
| 50 | + {name: 'Jory', taxesOwed: 11, bankBalance: 50}, |
| 51 | + {name: 'Vardis', taxesOwed: 15, bankBalance: 20} |
| 52 | +]; |
| 53 | + |
| 54 | +TaxCollector.prototype.collect = (items, value, projection) => { |
| 55 | + if (items.length > 1){ |
| 56 | + return projection(items[0]) + this.collect(items.slice(1), value, projection); |
| 57 | + } |
| 58 | + |
| 59 | + return projection(itms[0]); |
| 60 | +} |
| 61 | +``` |
| 62 | +위 코드는 항목과 어큐뮬레이터 값, 어큐뮬레이터에 통합되는 값을 투사하는 함수를 인자로 받는다. |
| 63 | + |
| 64 | +```js |
| 65 | +// 프로젝션 함수 |
| 66 | +item => Math.min(item.moneyOwed, item.bankBalance); |
| 67 | +``` |
| 68 | + |
| 69 | +이 함수를 준비시키기 위해 단순히 배열 및 프로젝션과 함께 어큐뮬레이터의 초기값을 전달해야 한다. |
| 70 | + |
| 71 | +어큐뮬레이터를 통한 각 패스는 배열 크기를 축소시킨다. |
| 72 | + |
| 73 | +이 모든 것이 가변 변수 없이 진행된다. |
| 74 | + |
| 75 | +--- |
| 76 | + |
| 77 | +내부 어큐뮬레이션은 문자열 첨부나 추가, 좀 더 복잡한 함수도 될 수 있다. |
| 78 | + |
| 79 | +어큐뮬레이터는 어큐뮬레이터 내부 집합의 값의 변경이 어렵다는 점만 제외하고 방문자 패턴과 유사하다. |
| 80 | + |
| 81 | +**함수형 프로그램은 부작용이 없다** |
| 82 | + |
0 commit comments