포스트

[함수 포인터] 03. 일급 객체와 고차 함수

이 전에 다룬 콜백 함수와 델리게이트의 글에 이어 일급 객체 (First-Class Citizen)와 고차 함수 (Higher-Order Function)에 대해서 설명하겠습니다.

우선, 간단하게 설명하자면,

일급 객체변수에 할당하거나 다른 함수에 전달할 수 있는 객체를 의미합니다.

고차 함수는 함수형 프로그래밍의 핵심 개념 중 하나로, 코드의 재사용성과 모듈성을 높여주는 개념으로, 함수를 인자로 받거나 반환하는 함수를 의미합니다.

이 두 개념은 프로그래밍 언어를 더욱 유연하고 유지보수를 하기 쉽게 만드는 개념들입니다.

일급 객체 (First-Class Citizen)

일급 객체란, 다음과 같은 특징을 가진 객체(대개 값, 변수, 함수 등)를 말합니다.

  1. 변수에 할당될 수 있습니다.
  2. 함수의 인자로 전달될 수 있습니다.
  3. 함수의 반환값으로 사용될 수 있습니다.

이전에 배운 함수 포인터와 콜백 함수는 일급 객체의 좋은 예입니다.

특정 함수의 주소를 저장하고, 함수의 인자로 전달될 수 있으며, 반환 할수도 있는 함수 포인터는 일급 객체입니다.

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. 함수를 반환할 수 있는 함수.

이전에 언급한, 콜백 함수를 인자로 받는 함수(함수 포인터를 인자로 받는 함수)를 고차 함수로 볼 수 있습니다.

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

[함수 포인터] 01. 함수 포인터와 멤버 함수 포인터

[함수 포인터] 02. 콜백 함수와 델리게이트

[함수 포인터] 04. 함수 포인터를 보기 좋게 만들기

이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.