한양과학기술고등학교

에듀테크 프로젝트 대시보드

함수형 프로그래밍 기초

함수형 프로그래밍은 "어떻게(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 고차 함수 — 함수를 만들어내는 함수
function makeMultiplier(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);