지금까지 우리가 배운 포인터들은 변수에 대한 포인터였다. 이젠 함수에 대한 포인터도 알아보자.
함수는 5를 반환하는 아주 기본적인 함수이다. 이를 cout를 이용하여 func
를 출력하면 어떻게 될까? 메모리 주소가 나오게 된다. 함수도 결국엔 메모리에 들어가 있기 때문에 이러한 결과가 출력된다.
위의 결과를 통해 우리는 함수도 메모리를 갖는 것을 알게 되었다. 그렇다면 이 함수를 포인터를 사용하여 뭔가 동작하게 만들 수 있지 않을까? 실제로 실험을 해보자.
포인터 함수에 func
를 넣고 출력을 하면 당연히 5가 나온다. 또한 다음 줄을 보면 변수에 다른 값을 넣어 초기화를 할 수 있는 것처럼, 포인터 함수에도 다른 함수를 넣어 초기화를 할 수 있다.
만약 주소를 출력하고 싶다면 위와 같은 형식으로 출력하면 되고, console에 4 byte가 차이나는 것은 포인터가 4byte씩 주소를 갖기 때문에 그렇다.
이러한 짝수와 홀수를 출력하는 코드가 있다고 가정하자. 이를 포인터 함수로 바꿔보자!
좀 이해하기 어려울 수도 있을 것 같다. 포인터 함수이다 보니 매개변수는 주소를 받을 수 있는 참조형식의 매개변수를 사용한다.
main문에서 printNumber(my_array, isEven)
에서 isEven 함수를 넣은 것을 보아야 하고, 이렇게 사용할 수 있는 이유는, printNumber()
의 매개변수에서 bool(*check_fcn)
과 같이 포인터 함수를 매개변수로 받도록 하기 때문에 가능하다. 함수이름만 넣었는데도 포인터로 받을 수 있는 이유는 위에서 설명한대로 함수의 이름 자체가 메모리 주소를 갖기 때문에 가능하다.
#include <functional>을 사용하여 쓰기도 하는데, 요즘 많이 사용하는 추세이다.