## 함수형 프로그래밍(functional programming)
함수형 프로그래밍은 프로그래밍 방법론 중 하나로, 수학적 함수의 개념을 기반으로 한다. 상태와 가변 데이터를 최소화하고, 순수 함수를 조합하여 프로그램을 구성합니다. 이는 부수 효과를 줄이고, 코드의 예측 가능성과 재사용성을 높이는 데 중점을 둡니다.
---
## 순수 함수 예제
순수 함수는 동일한 입력에 대해 항상 동일한 출력을 반환하며, 함수 외부의 상태를 변경하지 않는다.
C 언어에서의 예는 다음과 같다.
```c
int add(int a, int b) {
return a + b;
}
```
---
## 순수하지 않은 함수 예제
순수하지 않은 함수는 외부 상태를 변경하거나, 동일한 입력에 대해 다른 출력을 반환할 수 있다. C 언어에서의 예는 다음과 같다
```c
int counter = 0;
void increment() {
counter++;
}
```
이 함수는 전역 변수 counter의 값을 변경하므로, 외부 상태에 영향을 미치는 순수하지 않은 함수이다.
---
## 함수형 프로그래밍의 장점
- 가독성 향상: 순수 함수와 불변성을 강조하여 코드의 이해와 예측이 용이하다
- 디버깅 용이: 부수 효과가 없으므로, 함수 단위 테스트와 디버깅이 수월하다.
- 병렬 처리 효율성: 상태 공유를 최소화하여 동시성 문제를 줄이고, 병렬 처리를 효율적으로 수행할 수 있다.
---
## 함수형 프로그래밍의 예
C 언어는 함수형 프로그래밍을 직접 지원하지 않지만, 함수 포인터와 고차 함수를 활용하여 일부 개념을 구현할 수 있다. 예를 들어, 배열의 각 요소에 함수를 적용하는 map 함수를 다음과 같이 정의할 수 있다.
```c
void map(int* array, int length, int (*func)(int)) {
for (int i = 0; i < length; i++) {
array[i] = func(array[i]);
}
}
int square(int x) {
return x * x;
}
int main() {
int numbers[] = {1, 2, 3, 4, 5};
int length = sizeof(numbers) / sizeof(numbers[0]);
map(numbers, length, square);
for (int i = 0; i < length; i++) {
printf("%d ", numbers[i]);
}
return 0;
}
```
이 예제에서 map 함수는 배열의 각 요소에 square 함수를 적용하여, 함수형 프로그래밍의 일부 패턴을 구현하고 있다.
함수형 프로그래밍에서는 for나 while 같은 반복문 대신 map, filter, reduce 같은 고차 함수(Higher-Order Functions)를 사용하여 데이터를 변환하거나 처리할 수 있다. 이 방식은 코드의 가독성을 높이고, 반복문의 부수 효과를 줄여 함수형 프로그래밍의 장점을 살려준다.
---
## map의 개념
map 함수는 배열의 각 요소에 함수를 적용하여 새 배열을 반환하는 고차 함수이며, 원래의 배열은 변경되지 않는다. map을 사용하면 전통적인 반복문과 다르게 상태를 변경하지 않고 불변성을 유지할수 있다.
---
## map을 사용한 기본 예제
### 전통적인 반복문 예제
```c
void square_array(int* input, int* output, int length) {
for (int i = 0; i < length; i++) {
output[i] = input[i] * input[i];
}
}
int main() {
int input[] = {1, 2, 3, 4, 5};
int output[5];
int length = sizeof(input) / sizeof(input[0]);
square_array(input, output, length);
for (int i = 0; i < length; i++) {
printf("%d ", output[i]);
}
return 0;
}
```
### map을 사용한 방식
```c
void map(int* input, int* output, int length, int (*func)(int)) {
for (int i = 0; i < length; i++) {
output[i] = func(input[i]);
}
}
int square(int x) {
return x * x;
}
int main() {
int input[] = {1, 2, 3, 4, 5};
int output[5];
int length = sizeof(input) / sizeof(input[0]);
// map을 사용해 배열의 각 요소에 square 함수 적용
map(input, output, length, square);
for (int i = 0; i < length; i++) {
printf("%d ", output[i]);
}
return 0;
}
```
---
### 코드 동작 설명
- map 함수
- input 배열을 받아 각 요소에 대해 func 함수를 실행하고, 결과를 output 배열에 저장
- func는 고차 함수로, 매핑될 함수를 파라미터로 전달
- square 함수
- 주어진 숫자를 제곱하는 순수 함수
- map 내부에서 호출되며 배열의 각 요소에 적용
- 출력 결과
- input 배열 [1, 2, 3, 4, 5]의 각 요소가 square 함수에 의해 제곱되어 output 배열 [1, 4, 9, 16, 25]이 출력
---
### map 사용의 장점
- 코드 간결성: map은 반복문에 비해 더 간단하고 가독성이 높다
- 재사용 가능성: 다양한 변환 함수(square, increment 등)를 쉽게 교체하여 사용할 수 있다
- 불변성 유지: 원래 배열은 변경되지 않고, 결과를 새로운 배열에 저장
- 부수 효과 제거: 반복문처럼 전역 변수나 상태를 변경하지 않는다.
---
Comments
Post a Comment
좋은하루되세요. ^^