68.2 반환값과 매개변수가 있는 함수 포인터 만들기

이번에는 반환값과 매개변수가 있는 함수 포인터를 만들어보겠습니다. 다음과 같이 반환값 자료형을 지정해주고, 맨 뒤의 괄호에 매개변수의 자료형을 지정합니다(매개변수 이름은 생략해도 됩니다).

  • 반환값자료형 (*함수포인터이름)(매개변수자료형1, 매개변수자료형2);

예를 들어 int형 반환값, int형 매개변수가 두 개인 함수를 담을 수 있는 함수 포인터는 어떻게 만들까요?

int add(int a, int b)    // int형 반환값, int형 매개변수 두 개
{
    return a + b;
}

add 함수를 담을 수 있는 함수 포인터는 이렇게 만듭니다.

int (*fp)(int, int);    // int형 반환값, int형 매개변수 두 개가 있는 함수 포인터 fp 선언

이제 함수 포인터를 사용해보겠습니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

function_pointer_return_parameter_type.c

#include <stdio.h>

// 덧셈 함수
int add(int a, int b)    // int형 반환값, int형 매개변수 두 개
{
    return a + b;
}

// 곱셈 함수
int mul(int a, int b)    // int형 반환값, int형 매개변수 두 개
{
    return a * b;
}

int main()
{
    int (*fp)(int, int);    // int형 반환값, int형 매개변수 두 개가 있는 함수 포인터 fp 선언

    fp = add;                      // add 함수의 메모리 주소를 함수 포인터 fp에 저장
    printf("%d\n", fp(10, 20));    // 30: 함수 포인터로 add 함수를 호출하여 합을 구함

    fp = mul;                      // mul 함수의 메모리 주소를 함수 포인터 fp에 저장
    printf("%d\n", fp(10, 20));    // 200: 함수 포인터로 mul 함수를 호출하여 곱을 구함

    return 0;
}

실행 결과

30
200

int형 반환값과 int형 매개변수 두 개를 가지고 있는 add, mul 함수를 저장할 것이므로 함수 포인터를 선언할 때 반환값은 int로 지정하고, 맨 뒤의 괄호 안에는 int를 두 개 넣어줍니다. 이때 매개변수의 자료형만 알려주면 되므로 매개변수의 이름은 지정하지 않아도 됩니다.

//↓ 반환값 자료형
int (*fp)(int, int);    // int형 반환값, int형 매개변수 두 개가 있는 함수 포인터 fp 선언
//    ↑      ↖ int형 매개변수 두 개
// 함수 포인터 이름

이제 = (할당 연산자)를 사용하여 함수 포인터에 add 함수의 메모리 주소를 저장합니다.

fp = add;                       // add 함수의 메모리 주소를 함수 포인터 fp에 저장 

함수 포인터 fp에 괄호를 붙여서 호출하면서 매개변수에 값을 넣습니다. 여기서는 fp에 저장된 add 함수를 호출하므로 10과 20를 더한 값인 30이 나옵니다.

printf("%d\n", fp(10, 20));    // 30: 함수 포인터로 add 함수를 호출하여 합을 구함

fpmul 함수를 넣어서 곱을 구할 수도 있습니다.

fp = mul;                       // mul 함수의 메모리 주소를 함수 포인터 fp에 저장
printf("%d\n", fp(10, 20));     // 200: 함수 포인터로 mul 함수를 호출하여 합을 구함

즉, 함수 포인터를 활용하면 상황에 따라서 함수를 바꿔가며 호출할 수 있습니다.

지금까지 함수 포인터에 대해 배웠는데 문법이 좀 복잡했습니다. 함수 포인터는 C 언어에서도 어려운 부분에 속하므로 당장은 완벽하게 이해하지 않아도 됩니다. 나중에 함수 포인터가 필요할 때마다 다시 돌아와서 찾아보면 됩니다.