Menu
Coddy logo textTech

함수를 인자로 전달하기

Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 36번째.

함수 포인터의 가장 강력한 용도 중 하나는 이를 다른 함수의 인자로 전달하는 것입니다. 이를 통해 함수의 코드를 수정하지 않고도 함수에 사용자 정의 동작을 주입할 수 있으며, 이러한 기법을 때때로 콜백(callback)이라고 부릅니다.

두 개의 숫자에 대해 계산을 수행하는 함수를 생각해 봅시다. 연산을 하드코딩하는 대신, 수행할 연산을 정의하는 함수 포인터를 전달받을 수 있습니다:

typedef int (*Operation)(int, int);

int compute(int a, int b, Operation op) {
    return op(a, b);
}

compute 함수는 더하기를 하는지, 빼기를 하는지, 아니면 완전히 다른 작업을 하는지 알지 못합니다. 이 함수는 단순히 자신에게 전달된 함수가 무엇이든 호출할 뿐입니다:

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

int main() {
    printf("%d\n", compute(5, 3, add));       // 출력: 8
    printf("%d\n", compute(5, 3, multiply));  // 출력: 15
    return 0;
}

동일한 compute 함수가 어떤 함수를 전달하느냐에 따라 어떻게 다른 결과를 생성하는지 주목해 보세요. 이 패턴은 유연하고 재사용 가능한 코드를 작성하는 데 필수적입니다. 구조는 한 번만 작성하면, 함수의 사용자가 자신에게 필요한 특정 로직을 제공할 수 있습니다.

challenge icon

챌린지

쉬움

두 개의 정수와 연산 코드를 받아서, 해당 연산을 숫자에 두 번 연속으로 적용하고 최종 결과를 반환하는 apply_twice 함수를 작성하세요.

함수는 사용할 연산을 결정하는 연산 코드를 받게 됩니다. 솔루션 내부에 연산 함수들을 정의하고, 이를 함수 포인터를 인자로 받는 헬퍼 함수 compute에 전달해야 합니다.

필수 구조:

  • 두 개의 int 매개변수를 받고 int를 반환하는 함수 포인터에 대해 Operation이라는 typedef를 정의하세요.
  • 두 개의 연산 함수를 정의하세요: add (a + b 반환) 및 multiply (a * b 반환)
  • 두 개의 정수와 Operation 함수 포인터를 인자로 받아 연산을 호출한 결과를 반환하는 compute 함수를 정의하세요.
  • apply_twice에서 코드에 따라 적절한 연산을 선택한 다음, compute를 두 번 사용하세요: 먼저 원래 숫자들로 계산하고, 그 다음 결과값과 두 번째 숫자로 다시 계산합니다.

로직:

  1. op_code (1 = add, 2 = multiply)를 기반으로 연산 함수를 선택합니다.
  2. compute(a, b, operation)를 호출하여 중간 결과를 얻습니다.
  3. compute(intermediate, b, operation)를 호출하여 최종 결과를 얻습니다.
  4. 최종 결과를 반환합니다.

매개변수:

  • a (int): 첫 번째 숫자
  • b (int): 두 번째 숫자
  • op_code (int): 연산 코드 (1은 add, 2는 multiply)

반환값: 연산을 두 번 연속으로 적용한 후의 결과 (int)

예시: a = 5, b = 3, op_code = 1 (add)인 경우:

  • 첫 번째 계산: 5 + 3 = 8
  • 두 번째 계산: 8 + 3 = 11
  • 반환: 11

a = 2, b = 4, op_code = 2 (multiply)인 경우:

  • 첫 번째 계산: 2 × 4 = 8
  • 두 번째 계산: 8 × 4 = 32
  • 반환: 32

치트 시트

함수 포인터는 다른 함수의 인자로 전달될 수 있으며, 이를 통해 콜백(callbacks)이 가능해집니다. 이는 함수의 코드를 수정하지 않고도 사용자 정의 동작을 주입하는 방법입니다.

typedef를 사용하여 함수 포인터 타입을 정의합니다:

typedef int (*Operation)(int, int);

함수 포인터를 매개변수로 받는 함수를 생성합니다:

int compute(int a, int b, Operation op) {
    return op(a, b);
}

서로 다른 함수를 전달하여 다양한 동작을 수행합니다:

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

int main() {
    printf("%d\n", compute(5, 3, add));       // 출력: 8
    printf("%d\n", compute(5, 3, multiply));  // 출력: 15
    return 0;
}

이 패턴을 사용하면 구조는 한 번만 정의하고 사용자가 필요한 특정 로직을 제공하는 유연하고 재사용 가능한 코드를 작성할 수 있습니다.

직접 해보기

int apply_twice(int a, int b, int op_code) {
    // 여기에 코드를 작성하세요
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Object Oriented Programming의 모든 레슨