[기술 질문] #12_함수 포인터
함수 포인터에 대해 알아보겠습니다.
Overview
- 개념
- 대리자(Delegate)
- 콜백(Callback) 함수
#0. 개념
1. 함수 포인터??
// [ 반환 타입 | 포인터 이름 | 매개 변수 ]
int (*funcPtr1)(int a, int b);
void (*funcPtr2)();
- C++는 변수 혹은 배열을 가리키는 포인터와 함께 함수를 가리키는 포인터 또한 지원합니다.
#1. 대리자
1. 정의
- Delegate는 범용적이고, 타입 안정성을 갖고 이벤트 처리 및 콜백 매커니즘을 구현하는 중요한 개념입니다. Unreal C++의 Delegate는 함수 호출 작업을 위임받아, 일관된 관점을 갖고 처리하는 인터페이스입니다
2. 동작 방식
Details
- Delegate 선언 방법은 위 링크를 통해 확인 가능합니다.
- 매크로를 통해 선언한 Delegate는 이를 관리할 클래스 내부에 선언합니다.
- 해당 Delegate에 바인딩 하고자하는 콜백 함수는 BeginPlay() 함수 내부에 BindUFunction 혹은 AddDynamic 등을 활용하여 바인딩합니다.
- Delegate를 선언한 곳에서 이벤트 발생 시 ExecuteIfBound 혹은 Execute 함수를 호출하여 콜백 함수들을 호출합니다.
3. 특징
- 효율성 : Delegate는 이벤트를 효율적으로 처리할 수 있도록 해줍니다. Delegate는 이벤트 시스템의 핵심 구성 요소로서, 여러 이벤트에 대한 콜백 함수들을 관리하고 호출할 수 있는 메커니즘을 제공하기 때문입니다.
- 타입 안정성 : Delegate는 컴파일 시점에 타입 검사를 수행하여 타입 안정성을 제공합니다. 이러한 작업은 콜백 함수가 예상대로 호출되며, 콜백 함수와 이벤트 사이의 데이터 무결성을 보장하는데 도움이 됩니다. 예를들면, 특정 이벤트가 ‘uint8’ 유형의 데이터를 전달하도록 정의했다면, 그 이벤트를 처리하는 Delegate는 ‘uint8’ 유형의 함수 인자를 받는 콜백 함수들만 호출할 것이며, 이로 인해, ‘데이터 형식’으로 인한 오류 발생을 방지합니다.
- 다형성 : Delegate는 다형성을 제공하여, 다양한 타입의 콜백 함수를 동일한 이벤트에 바인딩 가능합니다. 더불어, 여러 개의 Delegate를 조합해 특정 이벤트를 처리하는 Delegate에 연결하여 복잡한 이벤트 처리 또한 가능해, 개발 작업에 유연성을 제공합니다.
- 멀티 캐스트 : 멀티캐스트 Delegate를 활용해 여러 곳에서 하나의 Multicast Delegate에 바인딩이 가능합니다. 따라서, 동일한 Delegate에 여러 객체 또는 액터가 반응해야 하는 상황에서 매우 유용합니다.
4. Custom Delegate
#2. 콜백 함수(Callback Function)
1. 콜백 함수??
- 호출될 함수를 알려주어 다른 프로그램 또는 모듈에서 함수를 호출하게 하는 방법입니다. 일반적으로 OS가 호출할 애플리케이션의 함수를 지정해 특정한 사건 또는 메시지가 발생했을 때 호출되도록 지정할 수 있습니다.
- 일반 함수와 콜백 함수의 차이점은 "제어권"이 누구에게 있는가입니다. 우리는 특정 작업을 수행하기 위해 해당 동작을 수행하는 함수를 호출합니다. 하지만, 콜백 함수는 우리가 직접 호출해 특정 동작을 수행하도록 하는 것이 아니라, 어떤 이벤트가 발생했을 때 호출되는 것입니다!
- 이때, 콜백 함수를 등록하는 과정에서 매개 변수로 함수 포인터를 넘겨주는 겁니다!
2. 코드 예제
#include <iostream>
using namespacestd;
typedef void(*CALLBACK_FUNC)(int);
CALLBACK_FUNC cbf = nullptr;
// 함수 포인터(콜백 함수 포인터) 등록 함수
void RegisterCallback(CALLBACK_FUNC InCbf)
{
if(InCbf != nullptr) cbf = InCbf;
}
// 콜백 함수를 호출하는 이벤트 함수
void StartCallback()
{
if(cbf == nullptr) return;
cout << "Callback Called!" << endl;
cbf(1);
}
// 콜백 함수
void UserCallbackFunc(int n)
{
if(n > 0) cout << n << endl;
}
int main()
{
// 함수 포인터 전달, 콜백 함수 등록
RegisterCallback(UserCallbackFunc);
StartCallback();
return;
}
Details
- 간단한 콜백 함수 예제 코드입니다.
- UserCallback() 메서드는 콜백 함수로, RegisterCallback() 함수에 "함수 포인터"를 통해 전달됩니다.
- StartCallback() 메서드는 일종의 "이벤트"로 호출되는 시점에 전달받은 콜백 함수를 가리키는 포인터를 통해 콜백 함수를 호출합니다.
- 정리하면, 콜백 함수 포인터를 이벤트에 전달하고, 이벤트 발생 시 해당 함수 포인터를 통해 콜백 함수를 호출합니다.
'언어 > 기술 질문' 카테고리의 다른 글
[기술 질문]#14_템플릿, Template (0) | 2023.03.12 |
---|---|
[기술 질문]#13_6가지 디폴트 멤버 메서드 (0) | 2023.03.05 |
[기술 질문]#11_허상 포인터(Dangling Pointer) (2) | 2023.02.18 |
[기술 질문]#10_실수형의 문자열 변환 (0) | 2023.02.18 |
[기술 질문]#9_부동 소수점, float (0) | 2023.02.18 |