69.4 함수 포인터를 함수의 반환값으로 사용하기

이번에는 함수 포인터를 반환값에 사용해보겠습니다. 반환값으로 사용할 때는 지금까지 사용했던 문법과는 조금 다릅니다.

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

그럼 int형 반환값, int형 매개변수가 두 개인 함수를 어떻게 반환할지 한 번 생각해보세요.

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

함수에서 add 함수를 반환하려면 이렇게 만듭니다.

int (*getAdd())(int, int)
{
}

함수를 만들어보았으니 이제 함수 안에서 함수 포인터를 반환하고, 바깥에서 사용해보겠습니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

return_function_pointer.c

#include <stdio.h>

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

int (*getAdd())(int, int)    // 함수 포인터를 반환값으로 지정
{
    return add;    // add 함수의 메모리 주소를 반환
}

int main()
{
    printf("%d\n", getAdd()(10, 20));    // 30: getAdd를 호출한 뒤 반환값으로 add 함수 호출

    return 0;
}

실행 결과

30

함수 포인터를 반환값으로 사용할 때는 먼저 (*getAdd())과 같이 * (애스터리스크) 뒤에 함수 이름을 지정하고 괄호를 붙입니다. 다시 이 상태에서 괄호로 묶어준 뒤 맨 앞에는 함수 포인터의 반환값 자료형, 맨 뒤 괄호 안에는 함수 포인터의 매개변수 자료형을 지정합니다. 함수 안에서는 return 키워드로 add 함수의 메모리 주소를 반환합니다.

//↓ 함수 포인터의 반환값 자료형
int (*getAdd())(int, int)     // 함수 포인터를 반환값으로 지정
{ //    ↑         ↑ 함수 포인터의 매개변수 자료형
  // 함수 이름
    return add;    // add 함수의 메모리 주소를 반환
}
참고

문법이 다소 복잡하지만 기존 문법을 사용하면 반환값에도 이름이 붙기 때문에 이런 방식을 사용합니다.

//    ↓ 반환값에 이름이 붙음
int (*fp)(int, int) getAdd()    // 잘못된 문법

함수 포인터를 활용하는 방법은 고급 주제이므로 문법을 꼭 외울 필요는 없습니다. 필요할 때 찾아보세요.

getAdd함수를 호출하면 add 함수의 포인터가 반환되겠죠? 따라서 다음과 같이 getAdd 함수를 호출한 뒤 바로 괄호를 붙여서 반환값으로 add 함수를 호출할 수 있습니다.

printf("%d\n", getAdd()(10, 20));    // 30: getAdd를 호출한 뒤 반환값으로 add 함수 호출

다음과 같이 getAdd()(10, 20)을 풀어서 쓸 수도 있습니다.

int (*fp)(int, int);

fp = getAdd();    // getAdd의 반환값을 함수 포인터 fp에 저장

printf("%d\n", fp(10, 20));    // 30: 함수 포인터 fp로 add 함수 호출
참고 | 매개변수가 있는 함수에서 함수 포인터 반환하기

매개변수가 있는 함수에서 함수 포인터를 반환하려면 다음과 같이 getAdd 뒤의 괄호 안에 매개변수의 자료형과 매개변수 이름을 지정해주면 됩니다.

return_function_pointer_parameter.c

int (*getAdd(int x, int y))(int, int)    // 함수 포인터 반환, int형 매개변수 두 개
{
    printf("%d %d\n", x, y);    // x, y는 getAdd 함수의 매개변수
    return add;
}

int main()
{
    printf("%d\n", getAdd(8, 9)(10, 20));    // 8, 9는 getAdd에 전달
                                             // 10, 20은 getAdd에서 반환된 add에 전달

    return 0;
}