
아래의 코드에서 2개의 전역함수가 있다
-> int add(int a, int b)
-> int subtract(int a, int b)
Calculate 함수안의 매개변수로 함수를 받아온다
-> 인자값에 들어있는 int (*operation)(int,int) 는 함수 포인터이다
-> 매개변수로 들어온 함수의 주소값을 저장하는 역할을 한다
즉, 매개변수로 여러 함수가 들어와서 처리를 할 수 있다
-> 같은 함수를 호출하지만, 다른 동작을 할 수 있다는 것
-> 똑같이 Calculate 함수를 호출했지만, 인자로 넘겨주는 함수가 다르기 때문에, 함수 안에서 다른 전역함수들이 호출된다
#include <iostream>
using namespace std;
// 두 수를 더하는 함수
int add(int a, int b)
{
return a + b;
}
// 두 수를 빼는 함수
int subtract(int a, int b)
{
return a - b;
}
// 두 수를 처리하는 함수. 함수 포인터를 매개변수로 받음
void calculate(int a, int b, int (*operation)(int, int))
{
cout << "Result : " << operation(a, b);
}
int main()
{
int x = 10, y = 5;
// add 함수 전달
calculate(x, y, add);
// subtract 함수 전달
calculate(x, y, subtract);
return 0;
}
아래의 Calculate 함수의 인자에 함수 포인터가 있다
void (*callback)(int)
-> 앞에서 다뤄보았다. void반환형을 가지고 매개변수는 정수형 1개인 함수를 가리킬 수 있는 포인터
*callback 포인터는 PrintResult 함수의 주소값을 저장하고 있다
-> callback 포인터를 통해서 해당 함수를 호출할 수 있다
#include <iostream>
using namespace std;
void PrintResult(int result)
{
cout << "Result : " << result << endl;
}
// 인자에 전역 함수 포인터
void Calculate(int a, int b, void (*callback)(int))
{
int result = a + b;
callback(result);
}
int main()
{
Calculate(5, 3, PrintResult);
return 0;
}
동적으로 다른 함수를 전달받고 호출할 수 있기 때문에 매우 유연하다
-> 여러 종류의 작업을 처리할 때, 어떤 함수를 실행할지 선택할 수 있다
-> 유니티에서 버튼 클릭 시 호출할 함수를 콜백으로 전달할 수 있다
콜백함수를 너무 난잡하게 사용 시, 코드의 의존성이 높아지고 가독성이 떨어지게 된다
Call : 클라이언트가 서버를 호출하는 경우
CallBack : 서버가 클라이언트를 호출하는 경우