함수 포인터 테이블
디스패치 패턴을 알아봅니다
함수 포인터 테이블은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 함수 포인터 선언
- 함수 전달
- 비교 함수와 qsort
- 함수 포인터 테이블