0Pricing
C Academy · 강의

함수 전달

콜백을 인수로 전달합니다

함수 전달은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

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