본문 바로가기

게임개발 수업

함수 포인터

함수 포인터란 포인터 변수에 함수를 담는 다는 이야기다.

 

함수 포인터를 사용하는 이유는 무엇일까?

 

기본적으로 함수는 코드영역에 저장된다. 코드영역에 저장된다라는 의미는 컴파일 타임에 결정된다는 뜻이다.

이는 우리가 함수를 동적으로(런타임때) 무언가를 처리하기 어렵다는 의미이다.

 

함수 포인터를 사용하지 않아도 된다. 그냥 함수를 여러개 만들어 두고, 상황에 따라 적절한 함수를 호출해도 된다.

실제로 내가 실무에서 함수포인터를 써본 적은 한번도 없다. 아무 문제 없다.

 

다만 함수포인터를 적절히 사용한다면 코드 재사용성이 올라가고, 이는 유지보수를 쉽게 만들어 준다는 장점이 있다.

 

함수 포인터와 비슷한 역할을 하는 것이 있다. <template>이다.

 

template도 함수 포인터와 마찬가지로 함수를 조금 더 동적으로 처리하기 위한 노력이다.

 

이 template과 함수포인터, 함수객체를 적절히 사용하는 것이 람다식이다.

람다식을 사용하면 코드가 매우 단순해지고 유연해진다. 

단점은 람다식을 모르면 이해하기 어렵다.

 

함수 포인터와 같은 목적으로 사용하는 대표적인 예가 std::sort() 함수이다.

 

sort() 함수는 기본적으로 오름차순 정렬이다.

함수가 오름차순 결과가 나오도록 작성되어 있는 것이다.

하지만 내림차순이 필요한 경우가 있다. 이럴땐 어떻게 해야 할까?

 

먼저 std::sort를 보면

Compare comp라는 것이 있다.

자세하게 이야기하면 함수객체지만(?) 결국에 함수포인터로 하려는 목적과 같다.

 

comp라는 함수에서 큰것이 먼저오도록 한뒤 돌려주면 된다.

 

//매개변수 재정의 compare 함수
bool compare(int a, int b)
{
    return a > b;
}

int main(){
    int arr[10] = { 2,6,5,8,3,7,9,1,4,10 };

    bool (*comp)(int a, int b);//함수 포인터 선언
    comp = compare;//함수 포인터 할당

    sort(arr, arr + 10, comp);
    cout << "내림차순 : ";
    for (int i = 0; i < 10; i++)
    {
        cout << arr[i] << " ";
    }

    return 0;
}

 

 

 

 

선언 방법

(반환형) (변수명*)(매개변수 타입 ...)

 

ex)

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

int main(){

    int (*pSum)(int a,int b);//함수 포인터 선언
    pSum = sum; //함수 포인터 할당

    pSum(2,3)//결과 5
}

'게임개발 수업' 카테고리의 다른 글

삼각비, 삼각함수  (0) 2022.12.07
WINAPI  (0) 2022.12.05
vector push_back 과 emplace_back의 차이  (0) 2022.12.01
팩토리 패턴  (0) 2022.11.29
객체 복사  (0) 2022.11.29