함수형 프로그래밍은 "어떻게(How) 반복문을 돌릴지" 대신
"무엇을(What) 변환할지"를 표현하는 스타일입니다.
핵심 도구는 map·filter·reduce 세 고차 함수이고,
지켜야 할 원칙은 순수 함수(Pure Function)와 불변성(Immutability)입니다.
1 map → filter → reduce 파이프라인
원본 배열
// 버튼을 순서대로 눌러 파이프라인을 실행하세요
const result = numbers
.map(x => x * 2) // 각 원소를 변환
.filter(x => x % 3 === 0) // 조건에 맞는 것만 통과
.reduce((acc, x) => acc + x, 0); // 하나의 값으로 누적// numbers 자체는 절대 바뀌지 않는다 (불변성)
2 순수 함수 vs 비순수 함수
💀 비순수 함수 (Impure)side effect
원본 배열 (mutate 대상)
addRandomFee(1000) — 같은 입력, 다른 출력
호출 결과 기록—
원본 배열이 직접 변경(mutate)되고, 같은 인자로 불러도
Math.random() 때문에 매번 결과가 다릅니다 → 예측 불가능, 테스트 어려움.
✅ 순수 함수 (Pure)no side effect
원본 배열 (그대로 유지)
arr.concat(99) 결과 (새 배열)
addFee(1000, 0.1) — 항상 같은 결과
호출 결과 기록—
원본은 절대 바뀌지 않고, 같은 입력이면 몇 번을 불러도
항상 같은 출력 → 참조 투명성(Referential Transparency).
3 고차 함수 — 함수를 만들어내는 함수
functionmakeMultiplier(n) {
// 함수를 리턴하는 함수 = 고차 함수return (x) => x * n;
}
const triple = makeMultiplier(3);
[1,2,3,4,5].map(triple); // [3, 6, 9, 12, 15]
4 명령형(Imperative) vs 선언형(Declarative)
명령형 — "어떻게" 반복할지 직접 기술
let total = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[i] % 2 === 0) {
total += nums[i] * 2;
}
}
선언형 — "무엇을" 원하는지만 기술
const total = nums
.filter(n => n % 2 === 0)
.map(n => n * 2)
.reduce((a, b) => a + b, 0);