프로그램의 변수가 메모리에 저장되는것 처럼 함수 또한 메모리의 특정 공간에 저장된다. 이러한 특성을 이용하여, 함수의 정보를 가르키는 포인터인 함수 포인터를 선언하고 사용할 수 있다.
함수 포인터는 말 그대로 함수의 주소값을 가진 포인터를 의미한다. 함수 포인터는 일반적으로 포인터 변수를 선언하듯이 선언하고, 함수를 할당하여 사용할 수 있다.
다음 예시는 함수를 하나 선언하고, 해당 함수를 함수 포인터에 할당해본다.
// 이 함수는 int 변수 두개를 인자로 받아서, 두 인자의 합을 반환하는 함수이다.
int SimpleCal(int a, int b){
return a + b;
}
// 아래는 함수 포인터에 SimpleCal 함수를 할당하고, 할당된 함수 포인터를 함수 같이 호출하는 방법이다.
// 아래는 반환 타입이 int인 int, int를 인자로 받는 함수의 함수 포인터이다.
int (*funcPtr) (int, int) = SimpleCal;
// 아래와 같이 함수 포인터를 함수와 똑같은 호출 방법으로 호출 할 수 있다.
int res = funPtr(1, 2);
콜백 함수란, 특정 상황이 발생했을때, 특정 함수를 실행하라는 명령을 담은 함수의 인자로 사용되는 함수이다.
예를 들면, 만약, 플레이어가 강제로 연결이 끊어진 경우에 A하는 함수를 실행해한다면, A의 함수 포인터를 연결을 감지하는 함수에 전달하여, 해당 상황이 발생 했을때, A 함수를 실행하도록 할 수 있다.
다양한 상황에서 런타임에서 동적으로 해당 상황에 맞는 함수를 바꿔가면서 실행 하고자 할때, 함수 포인터를 활용 할 수 있다.
예를 들면, 게임 속에서 캐릭터의 공격 방식이 런타임에서 바뀌어야 할 때, 캐릭터의 공격 함수를 함수 포인터를 통해 전달하면서 동적으로 바꿀 수 있다.