학습
Dart 함수형 프로그래밍 패턴
Dart 함수형 프로그래밍 패턴 — 중급
함수형 프로그래밍 패턴
1. 도입 (왜 배워야 하는가)
함수형 프로그래밍 패턴은 현대 소프트웨어 개발에서 점점 더 중요해지고 있습니다. 특히 Dart와 같은 언어에서 함수형 프로그래밍을 활용하면 코드의 가독성과 유지보수성을 크게 향상시킬 수 있습니다. 함수형 프로그래밍은 상태를 변경하지 않고, 순수 함수를 사용하여 데이터를 다루는 방식을 강조합니다.
이러한 패턴을 이해하지 못하면 다음과 같은 문제가 발생할 수 있습니다:
- 코드의 복잡성이 증가하여 디버깅이 어려워진다.
- 사이드 이펙트로 인해 함수의 동작이 예측 불가능해질 수 있다.
- 재사용 가능한 코드 작성이 어려워져, 중복 코드가 많이 발생하게 된다.
- 순수 함수: 동일한 입력에 대해 항상 동일한 출력을 반환하고, 외부 상태를 변경하지 않는 함수입니다.
- 고阶 함수: 다른 함수를 인자로 받거나, 함수를 반환하는 함수입니다.
- 불변성: 데이터가 한 번 생성된 이후에는 변경할 수 없는 특성을 의미합니다.
2. 핵심 개념 설명
함수형 프로그래밍 패턴의 핵심 개념들은 다음과 같습니다:
- 비유: 레시피를 따라 만든 요리는 항상 같은 재료로 만들면 같은 맛이 나야 합니다.
- 비유: 요리사가 다른 요리사에게 레시피를 가르치는 것과 같습니다.
- 비유: 한 번 만든 조각상을 다시 바꾸는 것이 아니라, 새로운 조각상을 만드는 것과 같습니다.
| 용어 | 설명 |
|---|---|
| 순수 함수 | 외부 상태에 영향을 주지 않고, 동일한 입력에 대해 동일한 출력을 반환하는 함수 |
| 고阶 함수 | 함수를 인자로 받거나 함수를 반환하는 함수 |
| 불변성 | 데이터가 생성된 이후에 변경되지 않는 성질 |
3. 기본 코드 예제
다음은 순수 함수의 간단한 예제입니다.
int add(int a, int b) {
return a + b; // 두 숫자를 더한 값을 반환합니다.
}
void main() {
print(add(2, 3)); // 5
}
add: 두 개의 정수를 받아 합계를 계산하는 순수 함수입니다.main: add 함수를 호출하여 결과를 출력합니다.실행 결과
5
add(2, 3) 호출 시 5를 반환합니다. 항상 같은 입력에 대해 같은 출력을 보장합니다.4. 실전 활용 예제
예제 1: 필터링 기능
쇼핑몰에서 장바구니에 추가된 상품 중 10000원 이상의 상품만 필터링하는 예제입니다.
List<double> filterExpensiveItems(List<double> items) {
return items.where((item) => item >= 10000).toList(); // 10000원 이상의 상품만 필터링합니다.
}
void main() {
List<double> cartItems = [5000, 15000, 3000, 20000];
print(filterExpensiveItems(cartItems)); // [15000.0, 20000.0]
}
예제 2: 맵핑 기능
장바구니에 있는 상품의 가격에 10% 할인을 적용하는 예제입니다.
List<double> applyDiscount(List<double> items) {
return items.map((item) => item * 0.9).toList(); // 10% 할인 적용
}
void main() {
List<double> cartItems = [10000, 20000, 30000];
print(applyDiscount(cartItems)); // [9000.0, 18000.0, 27000.0]
}
5. 흔한 실수와 주의사항
실수 1: 상태 변경
List<int> numbers = [1, 2, 3];
void addNumber(int number) {
numbers.add(number); // 상태를 변경합니다.
}
올바른 코드:
List<int> addNumber(List<int> numbers, int number) {
return [...numbers, number]; // 새로운 리스트를 반환합니다.
}
실수 2: 비순수 함수 사용
int counter = 0;
int increment() {
counter++; // 외부 상태를 변경합니다.
return counter;
}
올바른 코드:
int increment(int count) {
return count + 1; // 외부 상태를 변경하지 않습니다.
}
6. 정리
다음에 학습하면 좋은 주제: