Run if you want it

C_C++

[C++] CallBack Function(콜백함수)

rewyear 2020. 1. 29. 22:45
300x250

정의 - 호출될 함수를 알려주어, 다른 프로그램 또는 다른 모듈에서 함수를 호출 하게 하는 방법. 일반적으로 OS가 호출할 어플리케이션의 함수를 지정해 특정한 사건 or 메시지가 발발했을 때 호출되도록 지정할 수 있다. 이런 함수를 콜백함수라고 한다.

 

그림으로 표현한 Callback 메커니즘

 

더 자세히 설명해보면 일반적인 함수는 클라이언트 측에서 서버의 함수를 호출하여 사용하는 반면에,

 

콜백함수는 일반적인 함수 호출과는 다르게 함수 포인터(or 람다 함수 등)를 이용해 콜백함수를 서버 측으로 전달한다.

이후 서버 측에는 콜백함수를 바로 사용할 수도 있으며, 콜백함수를 등록한 후 추후()에 사용할 수도 있다.

(내가 호출하는게 아니라 서버 측에 의해서 호출됨)

 

이를 이용한 대표적인 예가 GUI 이벤트 & 핸들러이다.

 

특정 이벤트가 일어났을때 그에 맞는 처리가 되도록 핸들러를 등록하게 되면 서버 측에서 특정 이벤트가 발생됬을때 

핸들러를 호출하여 처리하는 시퀀스이다.

 

아래의 코드는 콜백 메커니즘을 설명하기 위한 코드이다. 

/////////// Callback 예제 ///////////

#include <iostream>
using namespace std;

///////////// Server ///////////////

typedef void(*CALLBACK_FUNC)(int); // 함수 포인터 정의

CALLBACK_FUNC cbf = NULL; // 실제 콜백함수를 다루기 위한 전역 변수

void RegistCallback(CALLBACK_FUNC cb) // 콜백 등록 함수
{
	cbf = cb;
}

void StartCallback() // 콜백 테스트를 위한 함수
{
	if(cbf == NULL)
	{
		cout << "Callback Function is not Registed" << endl;
		return;
	}

	cout << "Server calls CB." << endl;
	cbf(1); // 서버 측에 등록된 콜백함수 호출 / 인자로 1을 전달.
	
}

///////////// Client ///////////////

void UserCallback(int n)
{
	if(n == 1)
		cout << "True" << endl;
	else
		cout << "False" << endl;
}

int main()
{
	///////////// Client ///////////////	
	RegistCallback(UserCallback); // Callback 등록


	///////////// Server ///////////////
	StartCallback(); 

	return 0;
}

편의상 한 소스안에 서버와 클라이언트의 코드를 모두 때려넣었다.

 

실제로는 이렇게 한 소스안에 존재하지 않고 아래의 그림과 같이 서버<->클라이언트 분리되어있다. 

 

위의 예제가 실제로 어떻게 동작하는지 그림으로 표현하였다.

 

300x250

'C_C++' 카테고리의 다른 글

[C/C++] Volatile  (0) 2022.08.17
[C++] 가상함수(Virtual function)와 다형성  (0) 2020.05.31