C++를 공부하다 보면 함수 포인터(Function Pointer), std::function, Delegate 같은 개념들을 접하게 됩니다.
그런데 처음에는 이런 생각이 들기도 합니다.
함수를 왜 변수처럼 전달할까?
왜 콜백(Callback) 구조가 필요한 걸까?
그리고 게임 엔진을 조금 더 깊게 보다 보면,
생각보다 많은 시스템들이 결국 함수 호출을 “직접” 하지 않고, 간접적으로 연결하는 구조를 사용하고 있다는 것도 알게됩니다.
- 입력 이벤트
- UI 버튼 클릭
- AI 이벤트 처리
- 충돌 이벤트
- Observer 패턴
- Unreal Delegate
이번 시리즈에서는 아래의 내용을 단계적으로 정리했습니다.
- 함수 포인터
- Callback 구조
- std::function
- Delegate
- 멀티캐스트 Delegate
단순 문법 설명보다는 “왜 이런 구조가 필요한가” 그리고 “게임 엔진에서는 왜 이런 구조를 많이 사용하는가”를 중심으로 설명했습니다.
아래는 현재까지 작성한 글 목록입니다.
1. C++ 함수 포인터와 Callback 구조 이해하기
처음 함수 포인터를 보면 굉장히 낯설게 느껴질 수 있습니다.
함수 이름 앞에 복잡한 괄호가 붙고,
함수를 변수처럼 전달하는 문법도 처음에는 쉽게 와닿지 않습니다.
하지만 실제 프로그램 구조를 보다 보면 함수 포인터는 생각보다 굉장히 중요한 역할을 합니다.
이 글에서는
– 함수 포인터 기본 문법
– Callback 구조
– 함수 전달 방식
– 간접 호출 구조
같은 내용을 초심자 관점에서 설명합니다.
특히 “왜 함수 자체를 전달하려고 하는가”를 중심으로 흐름을 정리했습니다.
2. std::function은 왜 등장했을까?
함수 포인터는 강력하지만 사용하기 불편한 부분도 존재합니다.
하지만, 아래의 내용을 다루기 시작하면 함수 포인터만으로는 한계가 보이기 시작합니다.
- 멤버 함수
- Lambda
- 다양한 Callable 객체
이 글에서는 std::function이 왜 등장했는지, 그리고 함수 포인터와 어떤 차이가 있는지를 설명합니다.
또한, 아래의 내용들도 함께 정리합니다.
- Callable 객체
- Lambda
- std::bind
- 범용 함수 래퍼
최근 C++에서는 std::function이 굉장히 자주 등장하기 때문에, Modern C++ 흐름을 이해하기 위해서도 중요한 주제입니다.
3. 게임 엔진은 왜 Delegate 구조를 사용할까?
게임 엔진 구조를 보다 보면 Delegate라는 개념이 굉장히 자주 등장합니다.
특히 언리얼 엔진을 공부하다 보면 아래와 같이 델리게이트를 자연스럽게 접하게 됩니다.
- Dynamic Delegate
- Multicast Delegate
- Event
그런데 “그냥 함수를 직접 호출하면 되는 거 아닌가?”싶기도 합니다.
이 글에서는 Delegate가 왜 필요한지, 그리고 왜 게임 엔진들이 이런 이벤트 기반 구조를 중요하게 보는지를 설명합니다.
입력 시스템, UI, 충돌 이벤트, Observer 패턴 같은 실제 게임 구조와 연결해서 정리했습니다.
4. C++ Delegate 심화 구현과 멀티캐스트 구조 이해하기
Delegate 개념을 이해했다면, 이번에는 조금 더 실제 엔진 구조에 가까운 방향으로 들어가게 됩니다.
이 글에서는 아래의 내용들을 다룹니다.
- Delegate 직접 구현
- 멤버 함수 바인딩
- Multicast Delegate
- Listener 구조
- 이벤트 브로드캐스트
특히, “왜 게임 엔진들이 멀티캐스트 Delegate를 중요하게 사용하는가”를 실제 코드 기반으로 설명합니다.
입력 이벤트, UI 이벤트, 게임 오브젝트 통신과도 연결됩니다.
게임 엔진 아키텍처를 공부할 때 굉장히 중요한 내용들입니다.
게임 엔진을 공부하다 보면 생각보다 많은 시스템들이 결국 “간접 호출 구조”를 많이 활용한다는 점을 알게됩니다.
객체들이 서로 직접 의존하지 않고, 이벤트 기반으로 연결되기 시작하면서 이 시리즈에서 정리한 내용을 이해하는 것이 중요해집니다.
- Callback
- Delegate
- Observer
- Event System
그리고 델리게이트와 이벤트를 상용 엔진들이 간접 호출을 기반으로 하는 시스템을 사용하는 이유를 이해할 수 있게됩니다.
앞으로도 게임 엔진 구조와 관련된 다양한 내용을 계속 정리해보려고 합니다.