콜백 함수는 일반 함수와 호출 시점이 다릅니다.
📌 콜백 함수 실행 절차
1. 함수 포인터 전달 → 콜백 함수는 보통 다른 함수에 인자로 전달됩니다.
2. 이벤트 발생 → 특정 상황이 발생하면 이벤트가 발생합니다.
3. 콜백 호출 → 미리 등록된 콜백 함수를 호출합니다.
4. 콜백 실행 → 콜백 함수가 실행되며 특정 작업을 수행합니다.
콜백 개념을 이용하여 특정 조건을 만족하는 Item을 찾는 프로그램을 작성해보겠습니다.
#include <iostream>
using namespace std;
// 🎯 Item 클래스 정의
class Item {
public:
int _itemId = 0; // 아이템 ID
int _rarity = 0; // 희귀도
int _ownerId = 0; // 소유자 ID
};
// 🎯 함수 객체 (Functor) 정의: 소유자 ID 기반 아이템 찾기
class FindByOwnerId {
public:
bool operator()(const Item* item) {
return (item->_ownerId == _ownerId);
}
public:
int _ownerId; // 찾고자 하는 소유자 ID
};
// 🎯 함수 객체 (Functor) 정의: 희귀도 기반 아이템 찾기
class FindByRarity {
public:
bool operator()(const Item* item) {
return (item->_rarity >= _rarity);
}
public:
int _rarity; // 기준 희귀도
};
// 🎯 템플릿을 활용한 콜백 함수 (아이템 검색)
template<typename T>
Item* FindItem(Item items[], int itemCount, T selector) {
for (int i = 0; i < itemCount; i++) {
Item* item = &items[i];
if (selector(item)) { // 함수 객체를 사용하여 조건 체크
return item;
}
}
return nullptr;
}
// 🎯 main 함수
int main() {
// 🔹 콜백? : 특정 상황이 발생하면 호출해주는 함수
// ex) 스킬 버튼을 누르면 -> 스킬을 실행하는 함수를 호출
// 🔹 아이템 배열 선언 (총 10개)
Item items[10];
items[3]._ownerId = 100; // 3번째 아이템의 소유자 ID를 100으로 설정
items[8]._rarity = 2; // 8번째 아이템의 희귀도를 2로 설정
// 🔹 소유자 ID로 아이템 찾기
FindByOwnerId functor1;
functor1._ownerId = 100;
Item* item1 = FindItem(items, 10, functor1);
// 🔹 희귀도로 아이템 찾기
FindByRarity functor2;
functor2._rarity = 1;
Item* item2 = FindItem(items, 10, functor2);
// 🔹 결과 출력
if (item1) cout << "Owner 100인 아이템 찾음!" << endl;
if (item2) cout << "희귀도가 1 이상인 아이템 찾음!" << endl;
return 0;
}
✔ FindByOwnerId 클래스 (함수 객체)
class FindByOwnerId {
public:
bool operator()(const Item* item) {
return (item->_ownerId == _ownerId);
}
public:
int _ownerId;
};
() 연산자 오버로딩을 통해 함수를 호출하는 것처럼 사용할 수 있도록 구현되었습니다.item->_ownerId가 _ownerId와 같으면 true, 아니면 false를 반환합니다.✔ FindByRarity 클래스 (함수 객체)
class FindByRarity {
public:
bool operator()(const Item* item) {
return (item->_rarity >= _rarity);
}
public:
int _rarity;
};
_rarity 값을 기준으로 희귀도가 높은 아이템을 찾는 기능을 수행합니다.✔ FindItem 함수 템플릿
template<typename T>
Item* FindItem(Item items[], int itemCount, T selector) {
for (int i = 0; i < itemCount; i++) {
Item* item = &items[i];
if (selector(item)) {
return item;
}
}
return nullptr;
}
FindItem은 함수 객체를 매개변수로 받아 조건을 설정할 수 있도록 구현되었습니다.FindByOwnerId, FindByRarity 등의 다양한 선택자를 적용할 수 있습니다.✔ main 함수 실행 과정
1. 아이템 배열을 생성하고 일부 값을 설정합니다.
2. FindByOwnerId 함수 객체를 생성하고 _ownerId = 100으로 설정합니다.
3. FindByRarity 함수 객체를 생성하고 _rarity = 1로 설정합니다.
4. FindItem 함수를 호출하여 특정 조건에 맞는 아이템을 검색합니다.
5. 찾은 아이템이 존재하면 메시지를 출력합니다.
콜백 함수는 게임 개발에서 스킬 버튼을 누르면 특정 함수를 호출하는 구조에서도 사용됩니다.
#include <iostream>
using namespace std;
// 🔹 스킬 버튼이 눌렸을 때 실행할 함수
void Fireball() {
cout << "🔥 Fireball 시전!" << endl;
}
void IceBlast() {
cout << "❄️ IceBlast 시전!" << endl;
}
// 🔹 콜백 함수 사용 (함수 포인터)
void ExecuteSkill(void (*skillFunc)()) {
skillFunc(); // 전달받은 함수를 실행
}
int main() {
// 🔹 Fireball 스킬 사용
ExecuteSkill(Fireball);
// 🔹 IceBlast 스킬 사용
ExecuteSkill(IceBlast);
return 0;
}
🔥 Fireball 시전!
❄️ IceBlast 시전!
✅ ExecuteSkill 함수
| 개념 | 설명 |
|---|---|
| 함수 포인터 | 특정 함수의 주소를 저장하여 호출 |
| 함수 객체 (Functor) | () 연산자 오버로딩을 이용해 함수처럼 동작 |
| 템플릿과 결합 | FindItem과 같이 다양한 조건을 처리할 수 있는 유연한 함수 설계 가능 |
| 게임에서의 활용 | 스킬 버튼 클릭 시 콜백 함수를 등록하여 다양한 스킬을 실행 |