콜백 함수 در C

안녕하세요, 열망하는 프로그래머 여러분! 오늘 우리는 C 언어의 fascinatig한 콜백 함수 세계로 접근해 보겠습니다. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 이 개념을 안내해 드리는 것을 기쁘게 생각합니다. 믿으세요, 콜백을 이해한 후에는 프로그래밍에서 새로운 초능력을 풀어냈을 것 같은 느낌을 받게 될 것입니다!

C - Callback Function

콜백 함수는 무엇인가요?

초보 단계로 시작해 보겠습니다. 피자 파티에서 (누가 피자를 좋아하지 않겠어요?) 친구에게 피자가 도착하면 전화해 달라고 부탁하는 상황을 상상해 보세요. 친구는 사실상 콜백을 수행하고 있습니다 - 특정 이벤트가 발생했을 때 전화를 거네요.

C 프로그래밍에서 콜백 함수는 비슷하게 작동합니다. 콜백 함수는 다른 함수에 인수로 전달되는 함수입니다. 이 다른 함수는 특정 이벤트가 발생하거나 작업이 완료될 때 전달된 함수를 "되돌려 호출"합니다.

다음은 콜백 함수의 간단한 구조입니다:

void callback_function() {
// 함수 본문
}

void main_function(void (*callback)()) {
// 일부 코드
callback();  // 콜백 함수 호출
// 더 많은 코드
}

int main() {
main_function(callback_function);
return 0;
}

이 예제에서 callback_function은 우리의 콜백입니다. 이를 main_function에 전달하고, main_function은 실행 중 특정 시점에서 이를 호출합니다.

C에서 콜백 함수의 예

콜백을 더 구체적으로 보겠습니다. 콜백을 사용하여 계산이 완료된 후 메시지를 출력하는 간단한 프로그램을 만들어 보겠습니다.

#include <stdio.h>

// 우리의 콜백 함수
void print_result(int result) {
printf("결과는: %d\n", result);
}

// 계산을 수행하고 콜백을 호출하는 함수
void perform_operation(int a, int b, void (*callback)(int)) {
int sum = a + b;
callback(sum);  // 콜백 함수에 결과를 호출
}

int main() {
perform_operation(5, 3, print_result);
return 0;
}

이 예제에서:

  1. 우리는 print_result라는 콜백 함수를 정의합니다. 이 함수는 정수를 입력받아 출력합니다.
  2. perform_operation 함수는 두 정수와 함수 포인터를 인수로 받습니다.
  3. perform_operation 내부에서 우리는 합을 계산하고 그 결과로 콜백 함수를 호출합니다.
  4. main 함수에서 우리는 숫자와 print_result 콜백을 perform_operation에 호출합니다.

이 프로그램을 실행하면 다음과 같은 출력이 나타납니다: "결과는: 8"

인수를 받는 콜백 함수

콜백은 여러 인수를 받을 수 있습니다. 이전 예제를 확장하여 더 많은 연산을 포함시켜 보겠습니다:

#include <stdio.h>

// 인수를 받는 콜백 함수
void print_operation(char operation, int a, int b, int result) {
printf("%d %c %d = %d\n", a, operation, b, result);
}

// 계산을 수행하고 콜백을 호출하는 함수
void perform_operation(int a, int b, char op, void (*callback)(char, int, int, int)) {
int result;
switch(op) {
case '+': result = a + b; break;
case '-': result = a - b; break;
case '*': result = a * b; break;
case '/': result = a / b; break;
default: printf("잘못된 연산\n"); return;
}
callback(op, a, b, result);
}

int main() {
perform_operation(5, 3, '+', print_operation);
perform_operation(10, 4, '-', print_operation);
perform_operation(7, 2, '*', print_operation);
perform_operation(20, 5, '/', print_operation);
return 0;
}

이 프로그램은 다음과 같은 출력을 생성합니다:

5 + 3 = 8
10 - 4 = 6
7 * 2 = 14
20 / 5 = 4

여기서 우리의 콜백 print_operation은 네 개의 인수를 받습니다: 연산, 두 피연산자, 그리고 결과. 이를 통해 우리는 더 유연하고 정보가 풍부한 출력을 생성할 수 있습니다.

C에서의 콜백 타입

C에서는 콜백을 두 가지 주요 유형으로 분류할 수 있습니다:

  1. 동기 콜백: 이는 인수로 전달된 함수에 즉시 실행됩니다. 우리의 예제는 모두 동기 콜백입니다.

  2. 비동기 콜백: 이는 나중에 실행되도록 예약됩니다. 이는 이벤트駆動 프로그래밍이나 I/O 연산에서 자주 사용됩니다.

다음은 이러한 유형을 요약하는 표입니다:

유형 설명 사용 사례 예제
동기 즉시 실행 간단한 연산, 계산 우리의 산술 연산 예제
비동기 나중에 실행 이벤트 처리, I/O 연산 파일 읽기/쓰기 콜백, GUI 이벤트 핸들러

다음은 비동기 콜백을 사용하는 간단한 예제입니다:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void callback_function(int signum) {
printf("시그널 %d을 수신했습니다\n", signum);
}

int main() {
signal(SIGALRM, callback_function);
alarm(5);  // 5초 후에 알림 설정

printf("알림을 기다리는 중...\n");
pause();  // 시그널을 기다립니다

return 0;
}

이 예제에서 callback_function은 비동기 콜백으로 설정되어 있으며, SIGALRM 시그널을 수신할 때 호출됩니다. alarm(5) 함수는 5초 후에 SIGALRM 시그널을 보내고, pause() 함수는 시그널을 기다립니다.

그리고 여러분! 우리는 C 언어의 콜백 함수 세계를 여행했습니다. 콜백은 여러분의 프로그래밍 모험에서 언제나 신뢰할 수 있는 동반자입니다. 콜백을 연습하고, 곧 프로처럼 콜백을 사용할 수 있을 것입니다!

Credits: Image by storyset