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; }