함수 포인터 1

 

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

 

 


 

포인터

 

int main()
{
    int a = 10;
    
	// 바구니 주소
    // pointer[ 주소 ]  ->  주소 [    ]

    typedef int DATA;

    // 1) 포인터        *
    // 2) 변수 이름      pointer
    // 3) 데이터 타입    int
    DATA* pointer = &a;

    // 함수
    typedef int(FUNC_TYPE)(int a, int b);
    using FUNC_TYPE = int(int a, int b);   
}

 

 


 

함수 포인터

 

함수 포인터는 함수를 가리키는 포인터다.

반환형(*포인터변수명)(매개변수형);
ex. int (*fp)(int, int);

일반적인 포인터 변수는 데이터의 메모리 주소를 저장하는 반면, 함수 포인터는 함수의 메모리 주소를 저장한다. 이를 통해 함수를 동적으로 호출하거나, 함수를 매개변수로 전달할 수 있다.

 

#include <iostream>
using namespace std;

int Add(int a, int b) { return a + b; }

int Sub(int a, int b) { return a - b; }

int main()
{   // 함수
    typedef int(FUNC_TYPE)(int a, int b); // 방법1
    using FUNC_TYPE = int(int a, int b);  // 방법2(Modern C++방식). 위와 동일한 의미

    // 1) 포인터         *
    // 2) 변수 이름      fn
    // 3) 데이터 타입    함수 (인자는 int, int 반환은 int)
    FUNC_TYPE* fn;

    // 함수 포인터
    fn = Add;  // fn = Sub; 으로 바꾸면 함수가 바뀌기 때문에 상황에 따라 매우 편리하게 사용할 수 있다.

    // 함수의 이름은 함수의 시작 주소 (배열과 유사)
    int result = fn(1, 2);        // 기본 문법
    cout << result << endl;

    int result2 = (*fn)(1, 2);  // 함수 포인터는 *(접근 연산자) 붙어도 함수 주소!
    cout << result2 << endl;

    return 0;
}

 

함수의 이름함수의 시작 주소다!!

 

어셈블리 코드를 확인해보면 두 개 방식이 같다는 것을 알 수 있다.


 

함수 포인터 예시 - Item

 

#include <iostream>
using namespace std;

class Item{
public:
    Item() : _itemId(0), _rarity(0), _ownerId(0) {   }

public:
    int _itemId;    // 아이템을 구분하기 위한 ID
    int _rarity;    // 희귀도
    int _ownerId;    // 소지자 ID
};

typedef bool(ITEM_SELECTOR)(Item* , int);

Item* FindItem(Item items[], int itemCount, ITEM_SELECTOR* selector /* bool (*selector)(Item* item) */ /* 동작 */, int value)
{
    for (int i = 0; i < itemCount; i++)
    {
        Item* item = &item[i];
        if (selector(item, value))
            return item;
    }

    return nullptr;
}

bool IsRareItem(Item* item, int value) { return item->_rarity >= value; }

bool IsOwnerItem(Item* item, int ownerId) { return item->_ownerId == ownerId; }

int main()
{   
    Item items[10] = {};
    items[3]._rarity = 2;  // RARE
    Item* rareItem = FindItem(items, 10, IsRareItem, 2);
    Item* ownerItem = FindItem(items, 10, IsOwnerItem, 100);

    return 0;
}

 

 


 

 

전체 코드

 

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

int Add(int a, int b) { return a + b; }

int Sub(int a, int b) { return a - b; }

class Item{
public:
    Item() : _itemId(0), _rarity(0), _ownerId(0) {   }

public:
    int _itemId;    // 아이템을 구분하기 위한 ID
    int _rarity;    // 희귀도
    int _ownerId;    // 소지자 ID
};

//Item* FindItem(Item items[], int itemCount, int itemId)
//{
//    for (int i = 0; i < itemCount; i++)
//    {
//        Item* item = &item[i];
//        if (item->_itemId == itemId)
//            return item;
//    }
//
//    return nullptr;
//}

typedef bool(ITEM_SELECTOR)(Item* , int);

Item* FindItem(Item items[], int itemCount, ITEM_SELECTOR* selector /* bool (*selector)(Item* item) */ /* 동작 */, int value)
{
    for (int i = 0; i < itemCount; i++)
    {
        Item* item = &item[i];
        if (selector(item, value))
            return item;
    }

    return nullptr;
}

bool IsRareItem(Item* item, int value) { return item->_rarity >= value; }

bool IsOwnerItem(Item* item, int ownerId) { return item->_ownerId == ownerId; }

int main()
{   
	 int a = 10;

    // 바구니 주소
    // pointer[ 주소 ]  ->  주소 [    ]

    typedef int DATA;

    // 1) 포인터        *
    // 2) 변수 이름      pointer
    // 3) 데이터 타입    int
    DATA* pointer = &a;

    // 함수
    typedef int(FUNC_TYPE)(int a, int b);
    using FUNC_TYPE = int(int a, int b);


    // 1) 포인터        *
    // 2) 변수 이름        fn
    // 3) 데이터 타입    함수 (인자는 int, int 반환은 int)
    FUNC_TYPE* fn;

    // 함수 포인터
    fn = Add;  // fn = Sub; 으로 바꾸면 함수가 바뀌기 때문에 상황에 따라 매우 편리하게 사용할 수 있다.

    // 함수의 이름은 함수의 시작 주소 (배열과 유사)
    int result = fn(1, 2);        // 기본 문법
    cout << result << endl;

    int result2 = (*fn)(1, 2);  // 함수 포인터는 *(접근 연산자) 붙어도 함수 주소!
    cout << result2 << endl;
    
    Item items[10] = {};
    items[3]._rarity = 2;  // RARE
    Item* rareItem = FindItem(items, 10, IsRareItem, 2);

    return 0;
}

 

 

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

[C++] 함수 객체  (0) 2022.04.16
[C++] 함수 포인터 2  (0) 2022.04.16
[C++] 전방선언  (0) 2022.04.12
[C++] 캐스팅: static, dynamic, const, reinterpret cast  (0) 2022.04.10
[C++] 얕은 복사 vs 깊은 복사 2  (0) 2022.04.10