앞서 메모리에 대해 알아볼 때 변수와 함수 등 작성한 소스코드는 모두 RAM에 저장된다고 언급했었는데요, 당연하게도 함수 역시 포인터가 있습니다.
다만, 변수의 포인터는 배열을 만들거나 다른 함수에서 메모리의 데이터를 수정하기 위해 주로 사용하는 반면, 함수 포인터는 callback에 주로 사용합니다.
callback은 함수 포인터를 사용하여 함수를 다른 함수의 인수로 전달하는 프로그래밍 기법입니다.
예를 들어, A 함수에서 B 함수를 호출하면서 B 함수의 실행 결과를 A 함수에서 처리해야 하는 경우, B 함수를 A 함수의 인수로 전달하여 실행하고, B 함수에서 처리한 결과를 다시 A 함수로 반환하는 방식으로 구현할 수 있습니다. 이때, A 함수에서 전달한 함수는 B 함수에서 callback 함수로 사용됩니다.
callback 함수는 보통 이벤트 처리나 비동기 작업과 같이 동기적으로 처리하기 어려운 작업에 사용됩니다. 예를 들어, 파일 다운로드가 완료되었을 때 호출되는 함수를 callback 함수로 지정하여, 파일 다운로드가 완료되면 해당 함수가 실행되도록 할 수 있습니다.
저희가 공부하는 C언어 교재에서는 함수 포인터를 활용할 일이 많지 않아 함수 포인터의 대략적인 사용 방법만 설명하고 넘어가도록 하겠습니다.
함수 포인터는 일반적인 포인터와 마찬가지로 선언됩니다. 함수 포인터의 선언 방법은 다음과 같습니다.
return_type (*ptr_name)(arg_type1, arg_type2, ...);
Plain Text
복사
위의 선언에서 ptr_name은 포인터 변수의 이름, return_type은 함수의 반환 값의 자료형, arg_type은 함수의 인자의 자료형입니다.
함수 포인터를 사용하면 다른 함수를 호출할 수 있습니다. 예를 들어, 다음과 같이 함수 포인터를 사용하여 두 개의 정수를 더하는 함수를 호출할 수 있습니다.
int add(int a, int b) {
return a + b;
}
int (*add_ptr)(int, int) = &add;
int result = (*add_ptr)(2, 3); // result는 5가 됩니다.
Plain Text
복사
위의 예제에서 add_ptr은 add() 함수를 가리키는 함수 포인터입니다. add_ptr을 사용하여 add() 함수를 호출하고, 결과를 result 변수에 할당합니다.
함수 포인터는 함수를 인자로 받는 함수를 구현할 때 매우 유용합니다. 예를 들어, qsort() 함수는 정렬할 배열과 배열의 요소를 비교하는 함수를 인자로 받습니다.
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
Plain Text
복사
위의 예제에서 compar 인자는 비교 함수를 가리키는 함수 포인터입니다. 이러한 방식으로 함수 포인터를 사용하여 일반적인 함수의 기능을 확장할 수 있습니다.