함수 포인터 호출
Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 34번째.
이제 function pointer를 선언하고 function을 할당하는 방법을 알았으므로, 다음 단계는 실제로 해당 pointer를 통해 function을 호출하는 것입니다.
구문은 간단합니다. 일반 함수를 호출할 때와 똑같이 function pointer를 사용합니다:
int add(int a, int b) {
return a + b;
}
int main() {
int (*operation)(int, int) = add;
int result = operation(5, 3); // add(5, 3)을 호출합니다
printf("%d\n", result); // 출력: 8
return 0;
}pointer 이름 뒤에 인수를 포함한 괄호를 작성하기만 하면 됩니다. C는 자동으로 pointer를 역참조하고 pointer가 가리키는 function을 실행합니다.
(*operation)(5, 3)과 같은 명시적 역참조 구문을 사용할 수도 있지만, 이는 선택 사항이며 덜 일반적입니다. 두 형식 모두 동일한 결과를 생성합니다.
진정한 힘은 pointer를 서로 다른 functions에 재할당할 때 나타납니다:
int subtract(int a, int b) {
return a - b;
}
operation = subtract;
result = operation(5, 3); // 이제 subtract(5, 3)을 호출합니다
printf("%d\n", result); // 출력: 2이제 동일한 변수 operation이 완전히 다른 로직을 실행합니다. 런타임에 동작을 교체할 수 있는 이 능력은 C에서 다형성의 기반입니다.
챌린지
쉬움포인터를 통해 함수를 호출하고 어떤 함수가 실행되는지 바꾸는 연습을 해 봅시다. 런타임에 덧셈과 뺄셈 사이를 전환할 수 있는 간단한 계산기를 만듭니다.
다음과 같은 프로그램을 작성하세요.
- 두 개의 함수를 정의합니다.
add: 두 개의intparameters를 taking하고 합을 returning합니다.subtract: 두 개의intparameters를 taking하고 first에서 second를 뺀 값을 returning합니다.
main에서 두 개의intparameters를 taking하고int를 returning하는 functions를 가리킬 수 있는calc라는 function pointer를 Declare합니다.- 네 개의 inputs를 읽습니다. 두 개의 정수와 두 개의 operation 코드를 읽습니다.
- 각 operation 코드에 대해 다음을 수행합니다.
- appropriate function을
calc에 Assign합니다 (add는 1, subtract는 2). - 두 숫자를 사용하여 pointer를 through function을 Call합니다.
- result를 print합니다.
- appropriate function을
네 개의 inputs를 받습니다. first number, second number, first operation code (1 또는 2), 그리고 second operation code (1 또는 2)입니다.
Output에는 separate lines에 두 개의 results가 표시되어야 합니다. 같은 두 숫자를 사용해 수행한 각 operation에 대한 result입니다.
15
5이 예제에서 inputs가 10, 5, 1, 2라면, first operation (code 1)은 10 + 5 = 15를 더하고, 그다음 pointer가 Reassign되며, second operation (code 2)은 10 - 5 = 5를 subtract합니다.
이는 동일한 pointer variable을 calls 사이에 Reassign함으로써 완전히 다른 logic을 실행할 수 있음을 보여 줍니다.
직접 해보기
#include <stdio.h>
// TODO: 여기에 add 함수를 정의하세요
// TODO: 여기에 subtract 함수를 정의하세요
int main() {
// 입력을 읽습니다
int num1, num2, op1, op2;
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &op1);
scanf("%d", &op2);
// TODO: 'calc'라는 함수 포인터를 선언하세요. 이 포인터는 다음을 가리킬 수 있습니다
// 두 개의 int 매개변수를 받고 int를 반환하는 함수들
// TODO: 첫 번째 연산 코드(op1)에 대해:
// - 적절한 함수를 calc에 할당하세요 (1은 add, 2는 subtract)
// - 포인터를 통해 함수를 호출하고 결과를 출력하세요
// TODO: 두 번째 연산 코드(op2)에 대해:
// - calc를 적절한 함수로 재할당하세요
// - 포인터를 통해 함수를 호출하고 결과를 출력하세요
return 0;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러