함수를 인자로 전달하기
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 함수가 어떤 함수를 전달하느냐에 따라 어떻게 다른 결과를 생성하는지 주목해 보세요. 이 패턴은 유연하고 재사용 가능한 코드를 작성하는 데 필수적입니다. 구조는 한 번만 작성하면, 함수의 사용자가 자신에게 필요한 특정 로직을 제공할 수 있습니다.
챌린지
쉬움두 개의 정수와 연산 코드를 받아서, 해당 연산을 숫자에 두 번 연속으로 적용하고 최종 결과를 반환하는 apply_twice 함수를 작성하세요.
함수는 사용할 연산을 결정하는 연산 코드를 받게 됩니다. 솔루션 내부에 연산 함수들을 정의하고, 이를 함수 포인터를 인자로 받는 헬퍼 함수 compute에 전달해야 합니다.
필수 구조:
- 두 개의
int매개변수를 받고int를 반환하는 함수 포인터에 대해Operation이라는typedef를 정의하세요. - 두 개의 연산 함수를 정의하세요:
add(a + b 반환) 및multiply(a * b 반환) - 두 개의 정수와
Operation함수 포인터를 인자로 받아 연산을 호출한 결과를 반환하는compute함수를 정의하세요. apply_twice에서 코드에 따라 적절한 연산을 선택한 다음,compute를 두 번 사용하세요: 먼저 원래 숫자들로 계산하고, 그 다음 결과값과 두 번째 숫자로 다시 계산합니다.
로직:
op_code(1 = add, 2 = multiply)를 기반으로 연산 함수를 선택합니다.compute(a, b, operation)를 호출하여 중간 결과를 얻습니다.compute(intermediate, b, operation)를 호출하여 최종 결과를 얻습니다.- 최종 결과를 반환합니다.
매개변수:
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) {
// 여기에 코드를 작성하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.