[2023 방통대 C 스터디] 9. [함수 포인터] 함수도 사실..

앞서 메모리에 대해 알아볼 때 변수와 함수 등 작성한 소스코드는 모두 RAM에 저장된다고 언급했었는데요, 당연하게도 함수 역시 포인터가 있습니다.

다만, 변수의 포인터는 배열을 만들거나 다른 함수에서 메모리의 데이터를 수정하기 위해 주로 사용하는 반면, 함수 포인터는 callback에 주로 사용합니다.

💡 callback함수 포인터를 사용하여 함수를 다른 함수의 인수로 전달하는 프로그래밍 기법입니다.

예를 들어, A 함수에서 B 함수를 호출하면서 B 함수의 실행 결과를 A 함수에서 처리해야 하는 경우, B 함수를 A 함수의 인수로 전달하여 실행하고, B 함수에서 처리한 결과를 다시 A 함수로 반환하는 방식으로 구현할 수 있습니다. 이때, A 함수에서 전달한 함수는 B 함수에서 callback 함수로 사용됩니다.

callback 함수는 보통 이벤트 처리나 비동기 작업과 같이 동기적으로 처리하기 어려운 작업에 사용됩니다. 예를 들어, 파일 다운로드가 완료되었을 때 호출되는 함수를 callback 함수로 지정하여, 파일 다운로드가 완료되면 해당 함수가 실행되도록 할 수 있습니다.

저희가 공부하는 C언어 교재에서는 함수 포인터를 활용할 일이 많지 않아 함수 포인터의 대략적인 사용 방법만 설명하고 넘어가도록 하겠습니다.

함수 포인터는 일반적인 포인터와 마찬가지로 선언됩니다. 함수 포인터의 선언 방법은 다음과 같습니다.

c return_type (*ptr_name)(arg_type1, arg_type2, ...);

위의 선언에서 ptr_name은 포인터 변수의 이름, return_type은 함수의 반환 값의 자료형, arg_type은 함수의 인자의 자료형입니다.

함수 포인터를 사용하면 다른 함수를 호출할 수 있습니다. 예를 들어, 다음과 같이 함수 포인터를 사용하여 두 개의 정수를 더하는 함수를 호출할 수 있습니다.

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

int (*add_ptr)(int, int) = &add; int result = (*add_ptr)(2, 3); // result는 5가 됩니다.

위의 예제에서 add_ptradd() 함수를 가리키는 함수 포인터입니다. add_ptr을 사용하여 add() 함수를 호출하고, 결과를 result 변수에 할당합니다.

함수 포인터는 함수를 인자로 받는 함수를 구현할 때 매우 유용합니다. 예를 들어, qsort() 함수는 정렬할 배열과 배열의 요소를 비교하는 함수를 인자로 받습니다.

c void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

위의 예제에서 compar 인자는 비교 함수를 가리키는 함수 포인터입니다. 이러한 방식으로 함수 포인터를 사용하여 일반적인 함수의 기능을 확장할 수 있습니다.