학습
JavaScript 함수형 프로그래밍 패턴
JavaScript 함수형 프로그래밍 패턴 — 중급
함수형 프로그래밍 패턴
1. 도입 (왜 배워야 하는가)
함수형 프로그래밍 패턴은 현대 소프트웨어 개발에서 중요한 역할을 합니다. 특히, 복잡한 애플리케이션을 개발할 때 코드의 가독성과 유지보수성을 높여줍니다. 함수형 프로그래밍을 활용하면 상태를 변경하는 부수 효과(side effect)를 줄이고, 함수를 일급 객체로 다룰 수 있어 코드를 더 모듈화하고 재사용할 수 있습니다.
만약 함수형 프로그래밍 패턴을 모르고 전통적인 절차적 프로그래밍 방식만 고수한다면, 코드가 복잡해지고 오류가 발생할 가능성이 높아집니다. 또한, 협업 시 다른 개발자와의 소통이 어려워질 수 있습니다. 예를 들어, 상태 변화가 많은 애플리케이션을 개발할 때, 이를 관리하지 못하면 버그가 잦아지고 코드가 엉망이 될 위험이 큽니다.
2. 핵심 개념 설명
함수형 프로그래밍에서 중요한 몇 가지 개념을 소개합니다.
| 개념 | 설명 |
|---|---|
| 일급 객체 | 함수가 다른 함수의 인자로 전달되거나, 함수의 반환값으로 사용될 수 있는 개념. |
| 고阶 함수 | 함수를 인자로 받거나 함수를 반환하는 함수. |
| 불변성 | 데이터 구조를 변경하지 않고 새로운 데이터 구조를 생성하는 개념. |
이러한 개념은 마치 요리에서 재료를 조합해 새로운 요리를 만드는 것과 비슷합니다. 각 재료(함수)는 독립적으로 존재하면서도, 서로 결합하여 새로운 결과(값)를 만들어내는 것입니다.
3. 기본 코드 예제
아래는 함수형 프로그래밍의 기본적인 사용법을 보여주는 코드입니다.
// 두 수를 더하는 함수
const add = (a, b) => a + b;
// 고阶 함수: 두 함수를 받아서 조합하는 함수
const compose = (f, g) => (x) => f(g(x));
// 예제: 두 수를 더하는 함수를 조합하여 사용
const add5 = (x) => add(x, 5);
const result = compose(add5, add5)(10); // 10에 5를 두 번 더함
console.log(result); // 20
실행 결과:
20
코드 설명:
add함수는 두 수를 더하는 간단한 함수입니다.compose함수는 두 함수를 받아서, 인자로 주어진 값을 두 함수에 순차적으로 적용하는 고阶 함수입니다.add5함수는 주어진 수에 5를 더하는 함수입니다.compose(add5, add5)(10)는 10에add5를 두 번 적용하여 20을 반환합니다.- 잘못된 코드:
- 올바른 코드:
- 잘못된 코드:
- 올바른 코드:
- 함수형 프로그래밍은 코드의 가독성과 유지보수성을 높여줍니다.
- 일급 객체, 고阶 함수, 불변성은 함수형 프로그래밍의 핵심 개념입니다.
- 상태를 변경하지 않고 새로운 객체를 생성하는 방식을 사용하는 것이 중요합니다.
4. 실전 활용 예제
예제 1: 쇼핑몰에서 장바구니를 구현할 때
장바구니에 상품을 추가할 때, 기존의 장바구니 상태를 변경하지 않고 새로운 장바구니 객체를 생성하는 방식을 사용합니다.
const addItem = (cart, item) => [...cart, item]; // 기존의 장바구니에 새 상품 추가
let cart = [];
cart = addItem(cart, { name: '사과', price: 1000 });
cart = addItem(cart, { name: '바나나', price: 500 });
console.log(cart);
예제 2: 데이터 처리
데이터 배열에서 특정 조건에 맞는 항목을 필터링하고, 그 결과를 변형할 때 유용합니다.
const data = [1, 2, 3, 4, 5];
// 짝수만 필터링하고 제곱하는 함수
const processData = (data) => data.filter(x => x % 2 === 0).map(x => x * x);
const result = processData(data);
console.log(result); // [4, 16]
5. 흔한 실수와 주의사항
실수 1: 상태 변경
const addItemWrong = (cart, item) => {
cart.push(item); // 기존 객체를 변경함
return cart;
};
const addItemCorrect = (cart, item) => [...cart, item]; // 새로운 객체를 생성함
실수 2: 부수 효과
let total = 0;
const calculateTotal = (cart) => {
cart.forEach(item => total += item.price); // 전역 상태를 변경
};
const calculateTotal = (cart) => cart.reduce((sum, item) => sum + item.price, 0); // 부수 효과 없음
6. 정리
다음에 학습하면 좋은 주제로는 "비동기 프로그래밍"이나 "상태 관리 패턴"을 추천합니다.