-
함수형 프로그래밍 (Functional Programming)개발 2025. 4. 8. 22:54
함수형 프로그래밍은 상태나 데이터를 변경하지 않고, 오직 표현식과 함수만을 사용해 프로그램을 구성하는 패러다임입니다. 이 방식을 사용하면 가독성이 향상되고, 값의 예측이 가능해지며, 재사용 가능한 구조를 만들 수 있습니다. 그 결과 버그 발생 가능성도 줄어듭니다.
while,break 같은 제어문은 코드의 추적이 어려워지기 때문에 함수형 프로그래밍에서는 지양합니다.
- Pure Functions
- Immutability
- HOC
- Composition
Pure Functions
입력값에 대해 항상 동일한 출력을 리턴하며, 외부 상태를 변경하지 않습니다.
const sum = (a,b) => a + b;
위 함수는 고정된 입력값에 대해 동일한 출력을 내놓는 반면,
const COUNT = 10; const getCost = (a) => COUNT * a;
이 함수는 COUNT값이 변경되면 동일한 입력값이라도 리턴되는 값이 변경되기때문에, 순수하지 않습니다.
자바스크립트에서의 함수형 프로그래밍
순수함수 메서드 : String.prototype.slice, Array.Prototype.filter, Array.prototype.map, Array.prototype.join
비순수함수 메서드 : Array.prototype.forEach, Array.prototype.push
HOC
const withMemo = (fn) => { const cache = new Map(); //클로저 생성 return (...args) => { const key = JSON.stringify(args); if (cache.has(key)) { return cache.get(key); // 캐시에서 반환 } const result = fn(...args); cache.set(key, result); return result; }; }; const add = (a, b) => a + b; const memoizedAdd = withMemo(add); memoizedAdd(1, 2); // 계산 memoizedAdd(1, 2); // 캐시에서 반환
Composition
const range = (a, b) => a > b ? [] : [a, ...range(a + 1, b)]; // 재귀로 배열을 만듦 const multiply = arr => arr.reduce((p, a) => p * a); // 배열 값 곱하기 const factorial = n => multiply(range(1, n)); factorial(5); // 120 /* * 반복문 버전 */ function factorial(n) { let result = 1; for (let i = 1; i <= n; i++) { result *= i; } return result; } console.log(factorial(5)); // 120
Currying
- 여러개의 인자를 받는함수 => 인자. 하나씩 받는 함수들의 체인으로 바꾼것
- 재사용성, 부분 적용(partial application), 명확한 책임 분리
function add(a, b) { return a + b; } 위 함수를 아래처럼 바꾸는 것 function curriedAdd(a) { return function (b) { return a + b; }; } 이제 add(2, 3) 대신, curriedAdd(2)(3)처럼 호출합니다.
const multiply = a => b => a * b; const double = multiply(2); const triple = multiply(3); console.log(double(5)); // 10 console.log(triple(5)); // 15
//API 호출시 사용해보기
const fetchWithToken = token => endpoint => fetch(endpoint, { headers: { Authorization: `Bearer ${token}` } }); const fetchUser = fetchWithToken('abc123'); fetchUser('/api/users'); fetchUser('/api/posts');
'개발' 카테고리의 다른 글
[디자인패턴] Singleton (0) 2022.08.04 [Git] 여러 개발자와 협업을 하는 상황에서 생길수 있는 rebase 이슈 (0) 2022.07.29 깃허브 액션 (0) 2022.06.30 [리팩토링] - (2) 코드에서 나는 악취 (0) 2022.06.21 [리팩토링] - (1) 리팩토링 원칙 (0) 2022.06.19