C언어에서 포인터 변수 라는것이 있는데 이는 변수의 메모리 공간주소를 가리키는 변수이다.
"변수"이기 때문에 다양한 값이 할당 될 수 있는데 그 중 함수(function) 또한 포인터 변수에 할당될 수 있다.
아래 간단한 함수포인터 예제 먼저 봐보자.
#include <stdio.h>
int add(int a, int b) { //덧셈 함수 선언
return a + b;
}
int main() {
int (*operation)(int, int); //함수포인터 선언
operation = add; //함수포인터에 함수 할당
printf("%d\n", operation(5, 3));//함수호출 및 결과물 출력
return 0;
}
8 //출력결과
함수포인터를 선언하고 함수를 할당하는 방법은 다음과 같다.
①int ②(*operation)③(int, int);
①은 함수의 반환타입
②는 함수포인터 변수명
③는 함수에 필요한 매개변수를 지정
여기서 주의할 점은 아래 두개 선언은 다른것이라는 것
1. int operation(int,int); -> int값을 가리키는 pointer 값을 return하는 함수
2. int (operation)(int,int); -> int값을 반환하는 함수를 가리키는 함수포인터
연산 우선순위때문에 변수명에 ()를 씌운거라 생각하면 된다.
함수포인터를 사용하는 이유는 다음과 같다.
아래 코드는 이해를 돕는 예제 코드이다.
#include <stdio.h>
// 두 정수를 더하는 함수
int add(int a, int b) {
return a + b;
}
// 두 정수를 빼는 함수
int subtract(int a, int b) {
return a - b;
}
int main() {
// 함수 포인터 선언
int (*operation)(int, int);
// add 함수의 주소를 함수 포인터에 저장
operation = add;
// 함수 포인터를 사용하여 add 함수 호출
printf("Addition: %d\n", operation(5, 3));
// subtract 함수의 주소를 함수 포인터에 저장
operation = subtract;
// 함수 포인터를 사용하여 subtract 함수 호출
printf("Subtraction: %d\n", operation(5, 3));
return 0;
}
만약 add와 subtract 함수 이름을 직접 사용하면 코드의 가독성이 떨어지고, 함수를 변경해야 할때 함수 호출 부분을 일일히 찾아 수정해야 하는 번거로움이 있지만, 함수포인터를 사용하면 위 번거로움들을 해결할 뿐만 아니라 함수포인터를 이용하면 다양한 함수를 가리킬 수 있어 코드의 재사용성도 높아지는 이점이 있다.
약간 자바의 interface 문법과 비슷한것 같다.