[함수 포인터] 03. 일급 객체와 고차 함수
이 전에 다룬 콜백 함수와 델리게이트의 글에 이어 일급 객체 (First-Class Citizen)와 고차 함수 (Higher-Order Function)에 대해서 설명하겠습니다.
우선, 간단하게 설명하자면,
일급 객체는 변수에 할당하거나 다른 함수에 전달할 수 있는 객체를 의미합니다.
고차 함수는 함수형 프로그래밍의 핵심 개념 중 하나로, 코드의 재사용성과 모듈성을 높여주는 개념으로, 함수를 인자로 받거나 반환하는 함수를 의미합니다.
이 두 개념은 프로그래밍 언어를 더욱 유연하고 유지보수를 하기 쉽게 만드는 개념들입니다.
일급 객체 (First-Class Citizen)
일급 객체란, 다음과 같은 특징을 가진 객체(대개 값, 변수, 함수 등)를 말합니다.
- 변수에 할당될 수 있습니다.
- 함수의 인자로 전달될 수 있습니다.
- 함수의 반환값으로 사용될 수 있습니다.
이전에 배운 함수 포인터와 콜백 함수는 일급 객체의 좋은 예입니다.
특정 함수의 주소를 저장하고, 함수의 인자로 전달될 수 있으며, 반환 할수도 있는 함수 포인터는 일급 객체입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
int Add(int a, int b)
{
return a + b;
}
int Multiply(int a, int b)
{
return a * b;
}
// 함수 포인터를 반환하는 함수
int (*GetOperation(char op))(int, int)
{
if (op == '+')
{
return Add;
}
else if (op == '*')
{
return Multiply;
}
return nullptr;
}
int main()
{
int(*operation)(int, int) = GetOperation('+');
if (operation != nullptr)
{
std::cout << "결과: " << operation(5, 3) << std::endl; // Add 함수 호출
}
operation = GetOperation('*');
if (operation != nullptr)
{
std::cout << "결과: " << operation(5, 3) << std::endl; // Multiply 함수 호출
}
}
고차 함수 (Higher-Order Function)
고차 함수는 다음 조건 중 하나 이상을 만족하는 함수를 말합니다.
- 함수를 인자로 받을 수 있는 함수.
- 함수를 반환할 수 있는 함수.
이전에 언급한, 콜백 함수를 인자로 받는 함수(함수 포인터를 인자로 받는 함수)를 고차 함수로 볼 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
int Add(int a, int b)
{
return a + b;
}
int Multiply(int a, int b)
{
return a * b;
}
// 콜백 함수를 인자로 받는 고차 함수.
int Operation(int a, int b, int (*callBack)(int, int))
{
return callBack(a, b);
}
int main()
{
int n = Operation(5, 3, Add);
std::cout << "결과: " << n << std::endl;
n = Operation(5, 3, Multiply);
std::cout << "결과: " << n << std::endl;
}
Operation
함수는 세 번째 인자로 함수 포인터 int (*callBack)(int, int)
를 받기 때문에, 이는 고차 함수라고 할 수 있습니다.
콜백 함수 호출: 이후 Operation
함수 내부에서 전달받은 함수 포인터(callBack
)를 호출합니다. 따라서 이 함수 포인터(callBack
)는 콜백 함수로 사용되며, Operation
함수 내에서 호출됩니다.
참고
First-class citizen : Wikipedia