0Pricing
C Academy · 강의

함수 포인터 테이블

디스패치 패턴을 알아봅니다

함수 포인터 테이블은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

함수 테이블

함수 포인터를 배열에 저장하여 디스패치 테이블을 만들 수 있습니다. 인덱스나 코드로 실행할 함수를 선택하므로 긴 if-else 또는 switch 연쇄를 대신할 수 있습니다.

#include <stdio.h>

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

int main(void) {
    int (*ops[2])(int,int) = { add, sub };
    printf("%d\n", ops[0](5, 3));
    printf("%d\n", ops[1](5, 3));
    return 0;
}

테이블 인덱싱

배열의 인덱스를 사용하여 실행 중 연산을 선택하십시오. 인덱스는 사용자 입력이나 프로그램 상태에서 가져올 수 있습니다.

#include <stdio.h>

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

int main(void) {
    int (*ops[2])(int,int) = { add, mul };
    int choice = 1;
    printf("%d\n", ops[choice](6, 7));
    return 0;
}

switch 대체하기

각 case가 함수 하나만 호출하는 경우에는 디스패치 테이블이 switch보다 더 깔끔한 경우가 많습니다.

#include <stdio.h>

void start(void) { printf("start\n"); }
void stop(void)  { printf("stop\n"); }
void pause(void) { printf("pause\n"); }

int main(void) {
    void (*table[3])(void) = { start, stop, pause };
    for (int i = 0; i < 3; i++) table[i]();
    return 0;
}

typedef로 테이블 정리하기

함수 포인터 형식에 typedef를 사용하면 테이블 선언을 짧고 읽기 쉽게 만들 수 있습니다.

#include <stdio.h>

typedef int (*BinOp)(int,int);

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

int main(void) {
    BinOp ops[] = { add, sub };
    printf("%d\n", ops[0](10, 4));
    return 0;
}

기호를 함수에 매핑하기

각 연산자 기호를 병렬 배열이나 구조체 테이블의 함수와 연결한 다음, 이름으로 검색하십시오.

#include <stdio.h>

typedef int (*BinOp)(int,int);

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

int main(void) {
    char syms[] = {'+', '-'};
    BinOp ops[] = { add, sub };
    char want = '-';
    for (int i = 0; i < 2; i++)
        if (syms[i] == want) printf("%d\n", ops[i](9, 2));
    return 0;
}

구조체 기반 명령 테이블

이름과 처리 함수를 구조체에 묶은 다음 배열로 만드십시오. 이것이 전형적인 명령 테이블 패턴입니다.

#include <stdio.h>
#include <string.h>

typedef struct {
    const char *name;
    void (*run)(void);
} Command;

void hello(void){printf("hi\n");}
void bye(void){printf("bye\n");}

int main(void) {
    Command cmds[] = {{"hello", hello}, {"bye", bye}};
    const char *input = "bye";
    for (int i = 0; i < 2; i++)
        if (strcmp(cmds[i].name, input) == 0) cmds[i].run();
    return 0;
}

범위 검사

테이블을 통해 호출하기 전에 항상 인덱스가 유효한지 확인하여 배열 범위를 벗어나 읽지 않도록 하십시오.

#include <stdio.h>

typedef int (*Fn)(int);
int sq(int x){return x*x;}
int neg(int x){return -x;}

int main(void) {
    Fn table[] = { sq, neg };
    int n = 2;
    int idx = 5;
    if (idx >= 0 && idx < n) printf("%d\n", table[idx](3));
    else printf("index out of range\n");
    return 0;
}

상태 기계

디스패치 테이블은 상태 기계를 구동합니다. 각 상태는 함수 포인터이고, 처리 함수는 다음 상태의 인덱스를 반환합니다.

#include <stdio.h>

int state_a(void){ printf("A\n"); return 1; }
int state_b(void){ printf("B\n"); return -1; }

int main(void) {
    int (*states[2])(void) = { state_a, state_b };
    int s = 0;
    while (s >= 0) s = states[s]();
    return 0;
}

플러그인과 같은 디스패치

처리 함수를 테이블에 등록하면 큰 switch를 수정하는 대신 항목을 추가하여 새로운 동작을 넣을 수 있습니다.

#include <stdio.h>

typedef void (*Handler)(int);
void log_low(int v){printf("low %d\n", v);}
void log_high(int v){printf("high %d\n", v);}

int main(void) {
    Handler handlers[] = { log_low, log_high };
    int level = 1;
    handlers[level](7);
    return 0;
}

기본 처리 함수

알 수 없는 코드가 들어와도 디스패치가 조용히 실패하지 않도록 슬롯 하나나 대체 포인터를 마련하십시오.

#include <stdio.h>

typedef void (*Fn)(void);
void known(void){printf("known\n");}
void fallback(void){printf("unknown command\n");}

int main(void) {
    Fn table[] = { known };
    int n = 1, code = 9;
    Fn f = (code >= 0 && code < n) ? table[code] : fallback;
    f();
    return 0;
}

테이블이 확장에 유리한 이유

디스패치 테이블은 분기 논리를 데이터 검색으로 바꿉니다. 경우를 추가할 때 데이터를 추가하면 되므로 코드가 단순하고 빠르게 유지됩니다.

#include <stdio.h>

typedef int (*Fn)(int);
int a(int x){return x+1;}
int b(int x){return x*2;}
int c(int x){return x*x;}

int main(void) {
    Fn t[] = { a, b, c };
    for (int i = 0; i < 3; i++) printf("%d ", t[i](4));
    printf("\n");
    return 0;
}

빠른 확인

함수 포인터 테이블에 대한 이해도를 확인해 보십시오.

복습

함수 포인터 테이블을 사용한 디스패치 패턴을 배웠습니다:

  • 함수 포인터를 배열에 저장하고 인덱스로 선택합니다.
  • 긴 switch 연쇄를 대신하며, 데이터를 추가하는 방식으로 확장할 수 있습니다.
  • typedef와 구조체 명령 테이블을 사용하여 코드를 명확하게 만드십시오.
  • 항상 인덱스의 범위를 확인하고 기본 처리 함수를 제공하십시오.

자주 묻는 질문

“함수 포인터 테이블” 강의는 무료인가요?

네 — “함수 포인터 테이블” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“함수 포인터 테이블”에서 뭘 배우나요?

디스패치 패턴을 알아봅니다 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“함수 포인터 테이블” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 함수 포인터 선언
  2. 함수 전달
  3. 비교 함수와 qsort
  4. 함수 포인터 테이블
← C Academy(으)로 돌아가기