본문 바로가기
Script/C++

[C++] Chapter 06. 함수 포인터

by song.ift 2023. 5. 12.

포인터라는 건 주소를 담는 바구니.

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

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

int main()
{
    int a = 10;

    typedef int DATA;
	
    // 1) 포인터         *
    // 2) 변수이름       pointer
    // 3) 데이터 타입    int
    DATA* pointer = &a;
	
    // 함수 (고전적인 방식)
    typedef int(FUNC_TYPE)(int, int);
    // mordern C++
    using FUNC_TYPE = int(int a, int b);
	
    // 1) 포인터         *
    // 2) 변수이름       fn
    // 3) 데이터 타입    함수 (인자는 int, int. 반환은 int)
    FUNC_TYPE* fn;

    // 함수 포인터
    fn = add;

    // 함수의 이름은 함수의 시작 주소 (배열과 유사)
    int result = add(1, 2);
    result = fn(1, 2); // 기본 문법
    result = (*fn)(1, 2) // 함수 포인터는 *(접근 연산자) 붙어도 함수 주소!
}

함수에도 이름을 지어준 것처럼, 똑같이 함수의 타입도 정의할 수 있다.

💡 사용 이유
뺄셈과 덧셈함수를 바꿔준다고 하면 코드를 직접 다 바꿔주어야 한다.
근데 함수 포인터를 이용하면 일일이 코드를 바꿔주지 않고, 함수 포인터가 가리키는 함수만 바꿔서 활용할 수 있기 때문에 간편하고 유연하다

 

또 다른 활용

함수의 인자로 콜백

FindItem이란 함수가 앞으로 개발이 진행되면서 안전체크와 분기를 서서히 늘려나가게 되면 똑같은 함수의 이름으로 다양한 인자와 비슷한 코드가 많아 질 것이다. 그래서 함수 포인터를 사용.

함수 포인터를 사용하면 어떤 함수를 사용할지 고를수가 있으니, 동작 자체를 함수의 인자로도 넣을 수 있다는 얘기.

단점이라고 한다면, 정확하게 일치하는 시그니처만 호환한다.

그걸 보완하는게 나중에 함수 객체, 람다식과 같은 걸로 대응할 수 있다.

 

결론

함수 포인터는 말 그대로 포인터는 포인터인데, 타고갔더니 함수가 있다.

함수를 가리키는 포인터!

또 어떤 기능, 동작 자체를 함수로 넘기고 싶을 때 사용하는 것이 함수 포인터

 

댓글