C++ Chapter 7.7 : 함수 포인터

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 7. 함수 : 함수 포인터

배열의 이름이 배열의 주소 값을 가지듯, 함수의 이름함수의 주소를 가진다.


함수 포인터 정의 방법

int func(int x)
{
    return x;
}

int main()
{
    cout << func << endl; // 01201084 출력 (함수의 주소)
    
    int (*funcptr)(int) = func; // 함수 포인터 funcptr 선언 및 초기화

    cout << funcptr << endl; // 01201084 출력  
}
  • int : 주소에 있는 함수의 리턴 타입
  • (*funcptr) : 함수 포인터 이름 funcptr
  • (int) : 주소에 있는 함수의 매개변수 타입 적어주는 부분. 없으면 그냥 ()
  • = func : func 함수의 주소로 초기화 함. 함수의 이름은 그 함수의 주소 !


함수 포인터 사용 방법

int func(int x)
{
    return x;
}

int main()
{
    cout << func << endl; 
    int (*funcptr)(int) = func; 
    cout << funcptr << endl; 

    cout << funcptr(5) << endl;  // 5출력. func 함수의 주소를 가지고 있는 포인터 funcptr로 fun 함수를 사용할 수 있게 되었음
}
  • 함수 포인터 이름(파라미터)
    • 이렇게 주소를 담고 있는 함수의 기능을 사용할 수 있다.
    • 포인터 funcptr 이 함수 func의 주소를 가지고 있기 때문에 func(3)funcptr(3) 이렇게도 호출할 수 있다.
  • funcptr = func2
    • 이렇게 함수 포인터에 다른 함수를 대입을 하려면 리턴타입, 매개변수타입, 매개변수의 개수가 서로 일치해야 가능하다.
      • funcptr은 int (*funcptr)(int) 타입이므로 func2 함수 또한 리턴타입이 int고 매개변수 타입도 int고 매개변수도 1개여야 funcptr에 주소 대입이 가능하다.


함수 포인터를 파라미터로 넘기기

void printNumbers(const array<int, 10> &my_array, bool print_even)
{
    for (auto element : my_array)
    {
        if (print_even && element % 2 == 0) cout << element;
        if (!print_even && element % 2 == 1) cout << element;
    }
    cout << endl;
}
int main()
{
    std::array<int, 10> my_array{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    printNumbers(my_array, true); // 짝수인 원소만 출력
    printNumbers(my_array, false); // 홀수인 원소만 출력
}

짝수이면 ture 리턴 함수, 홀수이면 ture 리턴 함수 이렇게 만들어서 함수 자체를 파라미터로 넘겨 어떤 함수인지에 따라 다르게 계산하면 어떨까

bool isEven(const int & number)
{
    if (number % 2 == 0) return true;
}
bool isOdd(const int & number)
{
    if (number % 2 == 1) return true;
}
void printNumbers(const array<int, 10> &my_array, bool(*check_fcn)(const int &))
{
    for (auto element : my_array)
    {
        if (check_fcn(element) == true) cout << element;
    }
    cout << endl;
}
int main()
{
    std::array<int, 10> my_array{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    printNumbers(my_array, isEven); // 짝수인 원소만 출력
    printNumbers(my_array, isOdd); // 홀수인 원소만 출력
}
  • print_even 자리는 함수 이름을 받는 check_fcn로 대체 됐다.
    • 즉, 어떤 기능을 할지 넘겨 주는 것.
    • 함수 이름을 파라미터로 넘겨 기능을 명시
  • check_fcn는 함수 포인터이기 때문에 함수 이름을 넘겨 받아야 한다.
    • isEven 함수 이름을 넘기면 isEven(element) 되는거나 마찬가지.
    • isOdd 함수 이름을 넘기면 isOdd(element) 되는거나 마찬가지.
bool(*check_fcn)(const int &) = isEven

매개변수를 위와 같이 디폴트 값을 isEven으로 설정해주면 printNumbers(my_array) 이렇게만 호출하면 짝수인 원소만 출력된다.


함수 포인터 타입 줄여 쓰기

1. using

using check_fcn_t = bool(*)(const int &);

check_fcn_t funcptr = isEven; // bool(*funcptr)(const int &) = isEven 과 같다.
  • bool(*)(const int &)라는 데이터 타입을 check_fcn_t 로 줄여 쓸 수 있게 되었다.

2. typedef

typedef bool(*check_func_t)(const int &);

check_fcn_t funcptr = isEven; // bool(*funcptr)(const int &) = isEven 과 같다.
  • bool(*)(const int &)라는 데이터 타입을 check_fcn_t 로 줄여 쓸 수 있게 되었다.


std::function

  • #include <functional>
  • C++11에 처음 소개된 Function 기능을 함수 포인터보다도 더 많이 쓴다.
std::function<bool>(const int &) funcptr = isEven; // funcptr : bool 타입을 리턴하고 const int & 타입의 매개변수를 필요로 하는 함수의 주소를 담을 수 있는 변수


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

댓글남기기