콜백(callback)은 기본적으로 다른 코드에 인수(argument) 형태로 전달되는 실행 가능한 코드를 의미하며, 특정 시점에 해당 인수를 다시 호출하거나 실행하는 것이 기대됩니다. 조금 다른 관점에서 설명하면, 어떤 함수의 참조(주소)가 호출 목적으로 다른 함수의 매개변수에 전달될 때, 그 함수를 콜백 함수라고 부릅니다.
C에서 콜백 함수는 어떻게 구현할까?
C 언어에는 자바스크립트나 파이썬처럼 함수를 일급 객체(first-class object)로 직접 전달하는 문법이 없습니다. 대신 함수 포인터(function pointer)를 사용하여 콜백 메커니즘을 구현합니다. 즉, 함수의 시작 주소를 포인터 변수에 저장한 뒤, 이 포인터를 다른 함수에 넘겨주고 필요한 시점에 역참조하여 호출하는 방식입니다.
이러한 콜백 패턴은 이벤트 처리, 라이브러리의 유연한 확장, 정렬 함수의 비교 기준 지정(예: qsort) 등 다양한 상황에서 활용됩니다.
예제 코드
#include<stdio.h>
void my_function() {
printf("This is a normal function.");
}
void my_callback_function(void (*ptr)()) {
printf("This is callback function.\n");
(*ptr)(); // 콜백 함수 호출
}
main() {
void (*ptr)() = &my_function;
my_callback_function(ptr);
}
실행 결과
This is callback function. This is a normal function.
코드 동작 원리
위 코드의 흐름을 단계별로 살펴보면 다음과 같습니다.
1. main() 함수 안에서 void (*ptr)()라는 함수 포인터를 선언하고, my_function의 주소를 저장합니다.
2. 이 포인터를 my_callback_function에 인수로 전달합니다.
3. my_callback_function은 먼저 자신의 메시지를 출력한 후, 전달받은 포인터를 역참조((*ptr)())하여 원래 함수를 호출합니다.
결과적으로 my_callback_function이 먼저 실행되고, 그 내부에서 my_function이 "다시 불려지는(call back)" 형태로 동작하는 것을 확인할 수 있습니다. 이것이 바로 '콜백'이라는 이름의 유래이며, 함수 포인터를 통해 C 언어에서도 유연한 콜백 구조를 만들 수 있는 핵심 원리입니다.