함수를 인자로 전달하기
Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 36번째.
함수 포인터의 가장 강력한 활용 방법 중 하나는 함수 포인터를 다른 함수에 인수로 전달하는 것입니다. 이를 통해 해당 함수의 코드를 수정하지 않고도 사용자 지정 동작을 주입할 수 있습니다. 이 기법은 때때로 콜백이라고 합니다.
두 숫자에 대해 계산을 수행하는 함수를 생각해 보세요. 연산을 하드코딩하는 대신, 수행할 연산을 정의하는 함수 포인터를 받을 수 있습니다:
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 함수에 전달해야 합니다.
참고: 함수만 필요합니다. 테스트에서는 apply_twice를 직접 호출하고 반환값을 확인하므로, 입력을 읽거나 무엇인가를 출력하지 마세요.
필수 구조:
- 두 개의
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): 연산 코드 (add의 경우 1, multiply의 경우 2)
반환값: 연산을 두 번 연속으로 적용한 후의 결과 (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
직접 해보기
int apply_twice(int a, int b, int op_code) {
// 여기에 코드를 작성하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러