✅ 목표 (Goal)

✅ 콜백 예제: qsort 정렬

콜백 함수는 다른 함수에 의해 호출되도록 설계된 함수입니다. 함수 포인터를 사용하면 특정 동작을 동적으로 결정할 수 있습니다. 예를 들어, 정렬 알고리즘에서 비교 함수를 전달하여 정렬 기준을 동적으로 설정할 수 있습니다.

#include <stdio.h>
#include <stdlib.h>

// 비교 함수 (오름차순)
int compare_asc(const void* a, const void* b) {
    return (*(int*)a - *(int*)b);
}

// 비교 함수 (내림차순)
int compare_desc(const void* a, const void* b) {
    return (*(int*)b - *(int*)a);
}

int main() {
    int arr[] = {5, 2, 9, 1, 6};
    size_t n = sizeof(arr) / sizeof(arr[0]);

    // 오름차순 정렬
    qsort(arr, n, sizeof(int), compare_asc);
    printf("Ascending: ");
    for (size_t i = 0; i < n; i++) printf("%d ", arr[i]);
    printf("\\n");

    // 내림차순 정렬
    qsort(arr, n, sizeof(int), compare_desc);
    printf("Descending: ");
    for (size_t i = 0; i < n; i++) printf("%d ", arr[i]);
    printf("\\n");

    return 0;
}

✅ 이벤트 기반 프로그래밍: 버튼 클릭 이벤트 처리

버튼 클릭이나 키 입력과 같은 이벤트 처리에서 함수 포인터를 사용하여 동작을 동적으로 연결할 수 있습니다.

#include <stdio.h>
#include <stdlib.h>

// 함수 포인터 타입 정의
typedef void (*ButtonClickHandler)(void);

// 버튼 구조체 정의
typedef struct {
    char *label;
    ButtonClickHandler onClick;
} Button;

// 버튼 클릭 이벤트 핸들러 함수
void handleButton1Click() {
    printf("Button 1 clicked!\\n");
}

void handleButton2Click() {
    printf("Button 2 clicked!\\n");
}

// 버튼 생성 함수
Button* createButton(char *label, ButtonClickHandler handler) {
    Button *button = (Button *)malloc(sizeof(Button));
    button->label = label;
    button->onClick = handler;
    return button;
}

// 버튼 클릭 시 호출되는 함수
void clickButton(Button *button) {
    if (button && button->onClick) {
        button->onClick();
    }
}

int main() {
    // 버튼 생성
    Button *button1 = createButton("Button1", handleButton1Click);
    Button *button2 = createButton("Button2", handleButton2Click);

    // 버튼 클릭 시뮬레이션
    printf("Simulating button clicks...\\n");
    clickButton(button1);
    clickButton(button2);

    // 메모리 해제
    free(button1);
    free(button2);

    return 0;
}

✅ 버튼이 늘어날 경우

✅ 함수 테이블: 계산기 예제

여러 함수를 배열로 관리하여 인덱스를 통해 동적으로 호출할 수 있습니다. 상태 머신이나 명령 처리기에서 자주 사용됩니다.

#include <stdio.h>

// 연산 함수 정의
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
int multiply(int a, int b) { return a * b; }
int divide(int a, int b) { return b != 0 ? a / b : 0; }

int main() {
    // 함수 포인터 배열 (연산 테이블)
    int (*operations[4])(int, int) = {add, subtract, multiply, divide};

    int choice, x = 10, y = 5;

    printf("Choose operation: 0:Add, 1:Subtract, 2:Multiply, 3:Divide\\n");
    scanf("%d", &choice);

    if (choice >= 0 && choice < 4) {
        printf("Result: %d\\n", operations[choice](x, y)); // 선택한 연산 수행
    } else {
        printf("Invalid choice!\\n");
    }

    return 0;
}

✅ 트리 순회와 콜백: 이진트리 순회