함수 포인터 선언
Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 33번째.
지금까지 구조체 임베딩을 사용해 상속을 시뮬레이션하는 방법을 배웠습니다. 하지만 서로 다른 객체가 동일한 호출에 다르게 응답하는 진정한 다형성을 구현하려면 함수 포인터가 필요합니다.
함수 포인터는 함수의 주소를 저장하는 변수입니다. 일반 포인터가 데이터의 주소를 저장하는 것처럼, 함수 포인터는 실행 가능한 코드의 주소를 저장합니다.
문법은 처음에는 위협적으로 보일 수 있습니다. function pointer를 선언하려면 return 유형을 지정한 다음, 괄호 안에 별표와 함께 pointer 이름을 지정하고, parameters 유형을 지정합니다:
int (*operation)(int, int);이는 operation이라는 called 변수를 선언합니다. 이 변수는 두 개의 int parameters를 taking하고 int를 return하는 모든 function을 가리킬 수 can 있습니다. *operation 주위의 괄호는 매우 중요합니다. 괄호가 없으면 pointer를 반환하는 function that을 선언하게 됩니다.
이 pointer에 function을 assign하려면, 단순히 function의 이름(괄호 없이)을 사용하세요:
int add(int a, int b) {
return a + b;
}
int (*operation)(int, int);
operation = add; // 이제 operation이 add를 가리킵니다함수 이름은 해당 함수의 주소 역할을 합니다. &add를 명시적으로 사용할 수도 있지만 선택 사항입니다. C에서는 두 형식이 모두 동일합니다.
챌린지
쉬움함수 포인터를 선언하고 함수에 할당하는 연습을 해 봅시다. 함수 포인터가 서로 다른 산술 함수를 저장할 수 있는 간단한 수학 연산 시스템을 만드세요.
다음과 같은 프로그램을 작성하세요:
- 두 함수를 정의합니다:
multiply: 두 개의int매개변수를 받아 곱을 반환합니다subtract: 두 개의int매개변수를 받아 첫 번째 값에서 두 번째 값을 뺀 결과를 반환합니다
main에서 두 개의int매개변수를 받고int를 반환하는 함수를 가리킬 수 있는operation이라는 함수 포인터 변수를 선언합니다- 세 개의 입력을 읽습니다. 두 개의 정수와 연산 코드(곱셈은 1, 뺄셈은 2)입니다
- 연산 코드에 따라 적절한 함수를
operation포인터에 할당합니다 - 할당된 연산의 이름을 출력한 다음, 포인터를 통해 함수를 호출한 결과를 출력합니다
세 개의 입력을 받습니다: 첫 번째 숫자, 두 번째 숫자, 그리고 연산 코드(1 또는 2)입니다.
출력은 다음과 같은 형식이어야 합니다:
Operation: multiply
Result: 35여기서 multiply는 연산 이름이며(코드가 2인 경우에는 subtract), 35는 포인터를 통해 함수를 호출한 결과입니다(이 경우에는 5 × 7).
기억하세요. 함수 포인터를 선언하려면 반환 형식, 괄호와 별표를 사용한 포인터 이름, 그리고 매개변수 형식이 필요합니다. 함수를 할당할 때는 괄호 없이 함수 이름만 사용하세요.
직접 해보기
#include <stdio.h>
// TODO: 여기에 multiply 함수를 정의하세요
// TODO: 여기에 subtract 함수를 정의하세요
int main() {
int num1, num2, code;
// 입력 읽기
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &code);
// TODO: 'operation'이라는 함수 포인터를 선언하세요. 이 포인터는
// 두 개의 int 매개변수를 받고 int를 반환하는 함수를 가리킬 수 있습니다
// TODO: 연산 코드에 따라 (1은 multiply, 2는 subtract),
// 적절한 함수를 operation 포인터에 할당하세요
// TODO: 연산 이름과 결과를 출력하세요
// 형식:
// Operation: <name>
// Result: <result>
return 0;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러