C++

C++ 함수 포인터

Machine_웅 2022. 10. 27. 16:30
728x90
반응형

함수 포인터 (function pointer)

포인터가 다른 변수의 주소를 저장하는 변수라는 것을 배웠다.

이와 유사하게 함수 포인터(function pointer)는 함수를 가리키는 변수다.
즉, 함수의 주소를 저장하는 변수다.

 변수와 마찬가지로 함수는 메모리의 할당된 주소에 있다.


함수에 대한 포인터 (pointer to function)

비 상수 함수 포인터(non-const function pointer) 생성하는 문법은 C++에서 볼 수 있는 못생긴 문법 중 하나다.

// fcnPtr 는 인수가 없고 정수를 반환하는 함수에 대한 포인터다.
int (*fcnPtr)();

 

상수 함수 포인터를 만들기 위해서는 * 뒤에 const 키워드를 사용하면 된다.

int (*const fcnPtr)();

함수 포인터에 함수 할당

함수 포인터는 함수로 초기화 할 수 있다.

int foo()
{
    return 5;
}

int goo()
{
    return 6;
}

int main()
{
    int (*fcnPtr)() = foo; // fcnPtr points to function foo
    fcnPtr = goo; // fcnPtr now points to function goo

    return 0;
}

C++는 기본 자료형과 달리 필요할 경우 함수를 함수 포인터로 암묵적으로 변환하므로 주소 연산자 &를 사용할 필요가 없다.


함수 포인터를 사용해서 함수 호출

함수 포인터로 실제 함수를 호출할 수 있다. 호출하는 두 가지 방법이 있는데, 첫 번째는 명시적인 역참조 방법이다.

int foo(int x)
{
    return x;
}

int main()
{
    int (*fcnPtr)(int) = foo; // fcnPtr에 foo함수를 할당한다.
    (*fcnPtr)(5); // foo(5)를 fcnPtr로 호출한다.

    return 0;
}

함수 포인터는 주로 함수를 다른 함수에 전달할 때 유용하다. 
함수 포인터를 선언하는 원시적인 방법은 보기 나쁘고 오류를 발생시키기 쉬우므로 
typedef, using 또는 std::function을 사용하는 게 좋다.

 

함수 포인터를 더 예쁘게 만들기

typedef를 사용해서 함수 포인터를 일반 변수처럼 보이게 할 수 있다.

typedef bool (*validateFcn)(int, int);

위 코드는 인수로 두 개의 int를 가지고 bool 반환하는 validateFcn라는 함수 포인터를 정의한다.

이제 이렇게 하는 대신:

bool validate(int x, int y, bool (*fcnPtr)(int, int)); // ugly

이렇게 할 수 있다.

bool validate(int x, int y, validateFcn pfcn) // clean

C++ 11에서는 using을 사용해서 함수 포인터 타입에 대한 별칭을 만들 수 있다.

using validateFcn = bool(*)(int, int); // type alias

typedef보다 좀 더 자연스럽게 읽을 수 있다.


C++ 11에서의 std::function

C++ 11에서는 표준 라이브러리 <function> 헤더에 정의되어 있는 std::function을 이용해서 함수 포인터를 정의할 수 있다.

#include <functional>
bool validate(int x, int y, std::function<bool(int, int)> fcn); //std::function<반환타입(인수..)>

보시다시피, 반환 타입과 매개 변수는 꺾쇠(<>)안에 들어 있다. 매개 변수를 꺾쇠 속 괄호 안에 둠으로써 좀 더 명시적으로 읽을 수 있다. 매개 변수가 없다면 괄호 안의 내용을 비워두면 된다.

#include <functional>
#include <iostream>

int foo()
{
    return 5;
}

int goo()
{
    return 6;
}

int main()
{
    std::function<int()> fcnPtr; // int를 반환하고 매개 변수가 없는 함수 포인터 변수 fctPtr 선언
    fcnPtr = goo; // fcnPtr은 함수 goo를 가리킨다.
    std::cout << fcnPtr(); // 일반적인 함수처럼 함수를 호출할 수 있다.

    return 0;
}

 

 

결론 

int num = 10 ;

int * data = &num; 일때

 

* data 는  num과 같은 결과를 가져오고 => 10

data 은 &num 과 같은 결과를 가져온다 => 주소값

 


https://boycoding.tistory.com/233

 

728x90
반응형

'C++' 카테고리의 다른 글

C++ Linked List ( 단방향 )  (0) 2022.11.01
C++ 클래스 생성 / 헤더파일.  (0) 2022.10.28
C++ 공용체 ( union )  (0) 2022.10.27
C++ 구조체  (0) 2022.10.27
메모리의 동적 할당(dynamic allocation)  (0) 2022.10.27