콜백 함수 (Callback function)

 

인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!

 

 


 

콜백 함수

 

함수 포인터 + 함수 객체 + 템플릿

 

콜백 (Callback) :  다시 호출하다? 역으로 호출하다?

게임을 만들 때 이런 콜백의 개념이 자주 등장한다.
ex) MoveTask 실습 등

어떤 상황이 일어나면 -> 이 기능을 호출해줘
ex) UI 스킬 버튼을 누르면 -> 스킬을 쓰는 함수를 호출


 

 

콜백 함수의 단점

 

함수 포인터는 상태를 저장할 수 없다. 함수 포인터로 콜백 함수를 만드는건 간단한 일이지만 상태를 저장할 수 없다는 단점이 있다.

 

#include <iostream>
using namespace std;

class Item
{
public:
    int _itemId = 0;
    int _rarity = 0;
    int _ownerId = 0;
};

Item* FindItem(Item items[], int itemCount, bool(*func)(const Item*)) // 함수 포인터 형태
{
    for (int i = 0; i < itemCount; i++)
    {
        Item* item = &item[i];
        
        // bool 조건체크
            return item;
    }

    return nullptr;
}

int main()
{

    Item items[10];
    items[3]._ownerId = 100;
    items[9]._rarity = 2;

    FindByOwnerId functor1;
    functor1._ownerId = 100;

    FindByRarity functor2;
    functor2._rarity = 1;

    Item* item1 = FindItem(items, 10, functor1);
    Item* itme2 = FindItem(items, 10, functor2);

    return 0;
}

 

 

코드

 

#include <iostream>
using namespace std;

class Item
{
public:

public:
    int _itemId = 0;
    int _rarity = 0;
    int _ownerId = 0;
};

class FindByOwnerId
{
public:
    bool operator()(const Item* item)
    {
        return (item->_ownerId == _ownerId);
    }

public:
    int _ownerId;
};

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 = &item[i];
        
        if (selector(item))
            return item;
    }

    return nullptr;
}

int main()
{

    Item items[10];
    items[3]._ownerId = 100;
    items[9]._rarity = 2;

    FindByOwnerId functor1;
    functor1._ownerId = 100;

    FindByRarity functor2;
    functor2._rarity = 1;

    Item* item1 = FindItem(items, 10, functor1);
    Item* itme2 = FindItem(items, 10, functor2);

    return 0;
}

 


 

 

전체 코드

 

더보기
#include <iostream>
using namespace std;

// 콜백 (Callback)

class Item
{
public:

public:
    int _itemId = 0;
    int _rarity = 0;
    int _ownerId = 0;
};

class FindByOwnerId
{
public:
    bool operator()(const Item* item)
    {
        return (item->_ownerId == _ownerId);
    }

public:
    int _ownerId;
};

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 = &item[i];
        
        if (selector(item))
            return item;
    }

    return nullptr;
}

int main()
{

    Item items[10];
    items[3]._ownerId = 100;
    items[9]._rarity = 2;

    FindByOwnerId functor1;
    functor1._ownerId = 100;

    FindByRarity functor2;
    functor2._rarity = 1;

    Item* item1 = FindItem(items, 10, functor1);
    Item* itme2 = FindItem(items, 10, functor2);

    return 0;
}

 

 

 

 

'⭐ Programming > C++' 카테고리의 다른 글

[C++] smart pointer  (0) 2022.04.26
[C++]L-value와 R-value, R-value reference  (0) 2022.04.24
[C++] 템플릿(Template) 2: 클래스 템플릿  (0) 2022.04.17
[C++] 템플릿(Template) 1: 함수 템플릿  (0) 2022.04.16
[C++] 함수 객체  (0) 2022.04.16