전체 코드


1. 콜백 함수의 개념

콜백 함수는 일반 함수와 호출 시점이 다릅니다.

  • 일반 함수: 호출하는 즉시 실행됩니다.
  • 콜백 함수: 특정 이벤트가 발생했을 때 호출됩니다.

📌 콜백 함수 실행 절차
1. 함수 포인터 전달 → 콜백 함수는 보통 다른 함수에 인자로 전달됩니다.
2. 이벤트 발생 → 특정 상황이 발생하면 이벤트가 발생합니다.
3. 콜백 호출 → 미리 등록된 콜백 함수를 호출합니다.
4. 콜백 실행 → 콜백 함수가 실행되며 특정 작업을 수행합니다.


2. 콜백 함수 예제

콜백 개념을 이용하여 특정 조건을 만족하는 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;
}

3. 코드 분석

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. 찾은 아이템이 존재하면 메시지를 출력합니다.


4. 콜백 함수 활용 예시

콜백 함수는 게임 개발에서 스킬 버튼을 누르면 특정 함수를 호출하는 구조에서도 사용됩니다.

#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 함수

  • 함수 포인터를 사용하여 원하는 함수를 매개변수로 전달합니다.
  • 이를 통해 게임에서 버튼을 눌렀을 때 다양한 스킬을 실행할 수 있습니다.

5. 콜백 함수 정리

개념설명
함수 포인터특정 함수의 주소를 저장하여 호출
함수 객체 (Functor)() 연산자 오버로딩을 이용해 함수처럼 동작
템플릿과 결합FindItem과 같이 다양한 조건을 처리할 수 있는 유연한 함수 설계 가능
게임에서의 활용스킬 버튼 클릭 시 콜백 함수를 등록하여 다양한 스킬을 실행

profile
李家네_공부방

0개의 댓글