함수 전달
콜백을 인수로 전달합니다
함수 전달은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
인수로 사용하는 함수
함수 포인터는 단순한 값이므로 함수를 다른 함수에 전달할 수 있습니다. 전달받은 함수를 콜백이라고 합니다.
이를 통해 하나의 루틴이 동작의 일부를 맞춤 설정할 수 있습니다.
#include <stdio.h>
int apply(int x, int (*f)(int)) {
return f(x);
}
int square(int x) { return x * x; }
int main(void) {
printf("%d\n", apply(6, square));
return 0;
}콜백 매개변수
콜백 매개변수는 함수 포인터 변수와 같은 방식으로 선언합니다. 함수 내부에서는 다른 함수와 마찬가지로 호출합니다.
#include <stdio.h>
void run_twice(void (*action)(void)) {
action();
action();
}
void beep(void) { printf("beep\n"); }
int main(void) {
run_twice(beep);
return 0;
}동작 바꾸기
서로 다른 콜백을 전달하면 같은 고차 함수에서 서로 다른 결과를 얻을 수 있습니다.
#include <stdio.h>
int combine(int a, int b, int (*op)(int, int)) {
return op(a, b);
}
int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }
int main(void) {
printf("%d\n", combine(3, 4, add));
printf("%d\n", combine(3, 4, mul));
return 0;
}배열에 매핑하기
map 함수는 배열의 모든 요소에 콜백을 적용하여 배열 자체를 수정합니다.
#include <stdio.h>
void map(int *a, int n, int (*f)(int)) {
for (int i = 0; i < n; i++) a[i] = f(a[i]);
}
int inc(int x) { return x + 1; }
int main(void) {
int a[] = {1, 2, 3};
map(a, 3, inc);
for (int i = 0; i < 3; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}조건 함수로 필터링하기
조건 함수는 true 또는 false를 반환하는 콜백입니다. 이를 사용하여 조건에 맞는 요소를 세거나 선택할 수 있습니다.
#include <stdio.h>
int count_if(int *a, int n, int (*pred)(int)) {
int c = 0;
for (int i = 0; i < n; i++) if (pred(a[i])) c++;
return c;
}
int is_even(int x) { return x % 2 == 0; }
int main(void) {
int a[] = {1,2,3,4,5,6};
printf("%d\n", count_if(a, 6, is_even));
return 0;
}하나의 값으로 축약하기
축약 함수는 이항 콜백과 시작 누산기를 사용하여 배열을 하나의 값으로 합칩니다.
#include <stdio.h>
int reduce(int *a, int n, int init, int (*op)(int,int)) {
int acc = init;
for (int i = 0; i < n; i++) acc = op(acc, a[i]);
return acc;
}
int add(int a, int b) { return a + b; }
int main(void) {
int a[] = {1,2,3,4};
printf("%d\n", reduce(a, 4, 0, add));
return 0;
}비교 함수 전달
정렬과 검색에서는 동일한 알고리즘이 어떤 정렬 기준에도 작동하도록 비교 콜백을 받는 경우가 많습니다.
#include <stdio.h>
int max_by(int a, int b, int (*greater)(int,int)) {
return greater(a, b) ? a : b;
}
int gt(int a, int b) { return a > b; }
int main(void) {
printf("%d\n", max_by(3, 8, gt));
return 0;
}콜백 형식을 위한 typedef
콜백 형식에 typedef로 이름을 지정하면 함수 시그니처를 읽기 쉬워집니다.
#include <stdio.h>
typedef int (*IntFn)(int);
int apply(int x, IntFn f) { return f(x); }
int neg(int x) { return -x; }
int main(void) {
printf("%d\n", apply(5, neg));
return 0;
}기본 콜백 대체 동작
콜백이 NULL일 수 있다면 기본 동작을 제공하여 호출자가 콜백을 사용하지 않을 수 있도록 하십시오.
#include <stdio.h>
int apply(int x, int (*f)(int)) {
if (f == NULL) return x;
return f(x);
}
int dbl(int x) { return x * 2; }
int main(void) {
printf("%d\n", apply(9, NULL));
printf("%d\n", apply(9, dbl));
return 0;
}콜백으로 코드 결합도 낮추기
콜백을 사용하면 일반 알고리즘이 특정 연산과 독립적으로 유지됩니다. 라이브러리는 반복을 제공하고, 사용자는 동작을 제공합니다.
#include <stdio.h>
void for_each(int *a, int n, void (*visit)(int)) {
for (int i = 0; i < n; i++) visit(a[i]);
}
void show(int x) { printf("[%d]", x); }
int main(void) {
int a[] = {7, 8, 9};
for_each(a, 3, show);
printf("\n");
return 0;
}실행 중 콜백 선택
조건 선택과 전달을 결합하십시오. 콜백을 선택한 다음 고차 함수에 전달하면 됩니다.
#include <stdio.h>
int apply(int x, int (*f)(int)) { return f(x); }
int sq(int x) { return x * x; }
int cube(int x) { return x * x * x; }
int main(void) {
int power = 3;
int (*f)(int) = (power == 2) ? sq : cube;
printf("%d\n", apply(2, f));
return 0;
}빠른 확인
함수 전달에 대한 이해도를 확인해 보십시오.
복습
함수를 콜백으로 전달하는 방법을 배웠습니다:
- 함수 포인터와 같은 방식으로 콜백 매개변수를 선언합니다.
- map, filter, reduce, for_each와 같은 고차 함수를 작성합니다.
typedef를 사용하여 콜백 형식에 이름을 지정합니다.- 기본 동작을 사용하여
NULL콜백에 대비합니다.
자주 묻는 질문
“함수 전달” 강의는 무료인가요?
네 — “함수 전달” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“함수 전달”에서 뭘 배우나요?
콜백을 인수로 전달합니다 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“함수 전달” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.