함수형 프로그래밍 - ParkEunwoo/seoul-smart-app GitHub Wiki
Functional Programming
함수형 프로그래밍이란 기존 어떤 알고리즘(How)으로 동작하라고 명시하는 식의 프로그래밍에서 벗어나 무엇(What)을 해야하는 지 명시하는 방식의 프로그래밍이다. 함수가 특정 동작을 수행하는 역할을 담당하는 것과 반대로 함수가 다른 값을 변경시키거나 할 수 없다.
필요한 개념
- 1급 객체 (First Object)
- 고차 함수 (High-Order Function)
- 불변성 (Immutablility)
- 순수 함수 (Pure Function)
- 합성 함수 (Function Composition)
1급 객체 (First Object)
함수를 변수처럼 사용할 수 있어야한다. 파라미터로 전달하거나 함수의 반환값으로 사용할 수 있어야한다. 변수 명이 아닌 고유 식별자가 존재해야한다.
고차 함수 (High-Order Function)
- 함수에 함수를 파라미터로 전달할 수 있다.
- 함수의 반환값으로 함수를 사용할 수 있다.
const foo = function() {
const closure = 10;
return function() {
console.log('foo' + closure);
}
}
const bar = function(fc) {
fc();
}
bar(foo);
// 실행값
// foo10
불변성 (Immutablility)
데이터가 변경되어서는 안된다. 만약 변경이 필요할 경우 직접 원본 데이터를 변경하지 않고, 복사본을 만들고 변경한 복사본을 이용해 작업을 진행한다. 자바스크립트는 이를 위해 map과 reduce와 같은 함수를 제공한다.
const A = [10,20,30];
const B = A;
B.push(40);
위와 같이 한다면 A = B = [10, 20, 30, 40] 이므로 불변성에 위배된다.
const A = [10,20,30];
const B = [].concat(A);
B.push(40);
concat함수를 이용해 A의 복사본을 만들어서 변경해야한다.
순수 함수 (Pure Function)
- 동일한 입력값에 항상 같은 값을 반환하는 함수 (random이나 date같은 함수가 내부에서 사용되면 안된다.)
- 함수 외부의 상태값을 변경하거나 인자로 받은 값을 변경하지 않는 함수 (side effect 가 존재하면 안된다.)
합성 함수 (Function Composition)
함수형 프로그램은 여러 작은 순수함수들로 이루어져 있기 때문에 이 함수들을 연쇄적으로 병렬적으로 호출해서 사용할 수 있어야한다.
(x + y)^2 + 10 을 수행 할 떄
const sum = (x, y) => x + y;
const square = x => x * x;
const addTen = x => x + 10;
const answer = addTen(square(sum(1, 2))); // 이렇게 하지 않고
//compose를 활용해 연쇄적으로 호출을 처리하도록 한다.
const compose = (...fns) => fns.reduce((prevFn, nextFn) => (...args) => nextFn(prevFn(...args)), value => value);
const composeAnswer = compose(addTen, square, sum);