Language
함수형 프로그래밍(Functional Programming)이란?
2025-07-24 01:05

시작하기
프로그래밍을 하다보면 어디서부터 버그가 생겼고 상태가 어디서 부터 변경되었는지 알기 어려운 경우가 있다. 이런 문제를 해결하기 위한 하나의 접근 방식이 바로 함수형 프로그래밍이다. 함수형 프로그래밍이 어떤 철학과 원칙을 가지고 있는지, 자바스크립트에서는 이를 어떻게 구현할 수 있는지 간단히 알아보자.
함수형 프로그래밍 (Functional Programming, FP)
- 함수형 프로그래밍이란 함수를 일급 시민(First-class citizen)으로 다루며, 상태(state)와 변경(mutation)을 최소화하고 순수함수를 중심으로 프로그래밍하는 패러다임
- 수학의 함수 개념의 람다 계산법에서 유래됨
- 선언형 프로그래밍의 한 종류
나오게 된 배경
- 전통적인 명령형 프로그래밍은 상태변경과 사이드 이펙트 문제가 많았다. 복잡한 프로그래밍에서 버그 발생과 디버깅 어려움이 있었음
- 현대 컴퓨터는 멀티코어, 분산 시스템으로 발전했는데, 공유 상태를 가진 명령형 방식은 동시성 문제를 일으키기 쉽다
사용하면 좋은 점?
- 순수함수는 외부에 영향을 주지 않아 테스트가 쉽고 예측 가능한 코드 작성가능
- 함수형 프로그래밍은 상태 변경이 없기 때문에 동시성에 안전, 병렬처리에 적합
- 작은 순수 함수단위로 작성된 코드는 조합과 재사용이 쉬움
- 부작용이 없기 때문에 단위 테스트 간단
- map, filter, reduce 등의 고차 함수로 반복을 추상화하여 간결한 코드 작성 가능
함수형 프로그래밍에 특화된 언어
- Haskell : 대표적인 순수 함수형 언어, 부작용이 없는 코드를 강제함
- Elm: 웹 프론트엔드를 위한 함수형 언어. React보다 안정적인 상태 관리를 강조
- Clojure: 함수형 스타일의 JVM 기반 언어. Lisp 계열로, 불변성과 함수 조합 중심
함수형 스타일을 지원하는 언어
객체지향이나 절차형 기반이지만 함수형 스타일도 부분적으로 잘 지원함
- JavaScript : 고차함수, 클로저, 일급함수 등 함수형 요소가 풍부
- Kotlin : Java 기반 언어지만 함수형 스타일(map/filter/reduce/immutable 등)을 적극 지원
- Scala : Java 위에서 동작하지만 함수형 + 객체지향의 융합 모델
- Java (8 이상) : Stream API, lambda, Optional 도입으로 함수형 스타일 가능
자바스크립트의 함수형 언어 요소들
- 일급 함수 : 함수는 값처럼 변수에 할당가능
- 고차함수 : 함수를 인자로 전달하거나 반환 가능
- 클로저 : 함수가 자신이 선언된 스코프를 기억함
- 불편성 추구 가능 : Object.freeze, spread 연산자 등
- map/filter/reduce : 고차 함수로 배열 조작
- 순수 함수 작성 가능 : 외부 상태 없이 입력→출력으로만 구성 가능
자바스크립트는 함수형 언어과 객체 지향 프로그래밍 모두 지원하는 멀티 패러다임 언어이다
함수형 스타일 코드 예시
const numbers = [1, 2, 3];
const squared = numbers.map((n) => n * n); // 고차 함수
순수함수의 조건
- 동일한 인자를 넣으면 동일한 결과를 반환한다
f(2) = 4
면 언제 호출하든 항상 4
- 사이드 이펙트 없음
- 함수 외부의 상태를 변경하지 않아야 함
순수 함수 예시)
function add(x, y) {
return x + y;
}
순수하지 않은 함수 예시)
let count = 0;
function increment() {
count++;
return count;
}
- 외부 변수 count변경함 -> 사이드 이펙트
- 입력이 없어도 매번 결과가 달라짐
람다(lambda) 함수
- 람다 함수는 이름없는 익명 함수이다
- 자바스크립트에서는 보통 화살표 함수로 람다를 표현
const add = (a, b) => a + b;
- 간결한 콜백 함수 작성할때, 한 번만 쓰는 짧은 함수, 고차 함수의 인자로 전달할때 사용
클로저(closure) 함수
- 함수가 자신의 선언될 때의 외부 변수를 기억하는 능력
- 함수가 외부 스코프의 변수에 접근할 수 있는 현상
- 함수 + 그 함수가 선언된 렉시컬 환경 => 클로저
function outer() {
let count = 0;
return function inner() {
// 클로저 함수
count++;
console.log(count);
};
}
const counter = outer();
counter(); // 1
counter(); // 2
- 클로저는 내부 상태를 기억할 수 있기 때문에 순수함수가 아닐 수도 있고 함수형에서 자주 쓰인다
고차함수(High-Order Function)
자바스크립트 기준 많이 쓰는 고차함수 종류입니다
- 함수를 인자로 받거나 함수를 반환하는 함수
map
: 배열 요소를 변형해서 새배열 반환filter
: 조건에 맞는 요소만 추출reduce
: 배열을 누적 계산해 하나의 값으로 변경forEach
: 각 요소에 대해 함수 실행, 반환값Xfind
: 조건에 맞는 첫 요소 반환
마무리
함수형 프로그래밍은 단순히 함수를 많이 쓰자는 접근이 아니라 변경 가능한 상태를 줄이고 예측 가능한 코드를 만들수 있는 로직을 구성하는게 목적이다. 자바스크립트의 함수형 스타일을 지원하는 언어에서 이 패러다임을 부분적으로 적용해보는 것만으로도 코드 품질이 향상되고 유지보수성이 좋아질 수 있다. 특히 map, filter, reduce 등과 같은 고차함수를 적극적으로 사용하고 순수함수로 만드는 것이 함수형 스타일의 장점을 높일 수 있다.