어떤 기능이나 서비스를 제공하는 쪽을 서버 제공 받는 쪽을 클라이언트라고 한다. 코드도 마찬가지로 기능을 제공하는 서버 코드, 기능을 제공 받는 클라이언트 코드가 있다. 클라이언트 쪽에서 서버 코드를 호출하고 서버 코드에서는 콜백 함수라고 불라는 함수 포인터를 통해서 클라이언트 코드를 다시 호출한다. 책의 예제를 보면 감이좀 안오지만 예를 들어서 어떤 장비에서 서버로 신호를 보내고 그 신호를 클라이언트로 전달한다고 생각해보자. 클라이언트 측에서는 서버에게 장비에서 신호가 왔을때 데이터를 받기 위해 콜백 함수를 등록 할 것이다. 서버 함수는 장비의 신호를 기다리고 있다가 신호를 받고 무슨 신호를 받았는지 다시 콜백 함수에게 전달하는 식으로 콜백 함수가 쓰인다. 아래는 콜백 함수(함수 포인터)의 예제이다.
#include <iostream>
using namespace std;
//server
void For_each(int *begin, int *end, void(*pf)(int))
{
while (begin != end)
{
pf(*begin++);
}
}
//client
void Print1(int n)
{
cout << n << ' ';
}
void Print2(int n)
{
cout << n + n << ' ';
}
void Print3(int n)
{
cout << n * n << ' ';
}
int main()
{
int tArray[5] = { 10,20,30,40,50 };
For_each(tArray, tArray + 5, Print1);
cout << endl;
For_each(tArray, tArray + 5, Print2);
cout << endl;
For_each(tArray, tArray + 5, Print3);
return 0;
}
실전에서 개발할때는 그냥 별 생각없이 썼었는데 콜백 함수 자체가 함수 포인터의 개념이였다.