함수 포인터 사용법 & 예제 총정리
함수 포인터는 C/C++에서 매우 유용한 기능 중 하나입니다. 함수 포인터를 사용하면 다른 함수를 가리키는 포인터 변수를 선언하고 사용할 수 있습니다. 이 포스팅에서는 함수 포인터의 기본적인 사용법과 몇 가지 예제를 다루고자 합니다.
함수 포인터란?
함수 포인터는 함수의 주소를 저장할 수 있는 포인터 변수입니다. 함수 포인터를 사용하면 함수를 변수처럼 다룰 수 있어서 함수를 동적으로 선택하거나 다른 함수에 매개변수로 전달하는 등 다양한 활용이 가능합니다.
함수 포인터는 일반적으로 다음과 같은 형태로 선언됩니다.
리턴타입 (*포인터변수명)(매개변수 타입)
예를 들어, int
를 반환하고 int
매개변수를 가지는 함수를 가리키는 함수 포인터는 다음과 같이 선언할 수 있습니다.
int (*fp)(int);
함수 포인터 사용법
함수 포인터에 함수 주소 할당하기
함수 포인터에는 특정 함수의 주소를 할당할 수 있습니다. 일반적인 변수에 값을 할당하는 것과 문법이 조금 다릅니다. 함수 포인터에 함수 주소를 할당하려면 다음과 같이 함수 이름만 적어주면 됩니다.
int sum(int a, int b) {
return a + b;
}
int (*fp)(int, int) = sum;
함수 포인터로 함수 호출하기
함수 포인터를 사용하면 할당된 함수를 호출할 수 있습니다. 함수 포인터로 함수를 호출하려면 함수 포인터를 그냥 함수처럼 사용하면 됩니다.
int result = fp(3, 4); // sum(3, 4)와 동일한 결과를 리턴함
함수 포인터의 매개변수
함수 포인터는 해당 함수의 매개변수와 일치하는 타입의 함수만 가리킬 수 있습니다. 따라서 함수 포인터의 매개변수를 명시해주어야 합니다. 예를 들어, int
를 반환하고 int
매개변수를 가지는 함수를 가리키는 함수 포인터는 다음과 같이 사용할 수 있습니다.
int print_number(int num) {
printf("Number: %d\n", num);
}
void (*fp)(int) = print_number;
함수 포인터 예제
예제 1: 함수 포인터를 사용한 정렬
함수 포인터를 사용하여 정렬 알고리즘을 구현하는 것이 일반적인 예제입니다. 예를 들어, 오름차순으로 정렬하는 bubble_sort
함수를 작성해보겠습니다.
void bubble_sort(int* arr, int size, int (*compare)(int, int)) {
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if ((*compare)(arr[j], arr[j + 1])) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int ascending(int a, int b) {
return a > b;
}
int descending(int a, int b) {
return a < b;
}
int main() {
int arr[] = {5, 3, 1, 4, 2};
int size = sizeof(arr) / sizeof(arr[0]);
// 오름차순 정렬
bubble_sort(arr, size, ascending);
printf("Ascending order: ");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 내림차순 정렬
bubble_sort(arr, size, descending);
printf("Descending order: ");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
예제 2: 함수 포인터를 사용한 콜백 함수
함수 포인터는 콜백 함수를 구현하는 데에도 활용됩니다. 콜백 함수는 다른 함수에서 호출되는 함수로, 이를 이용하여 다른 함수의 동작을 확장하거나 변경할 수 있습니다. 예를 들어, 원하는 횟수만큼 반복 출력하는 repeat
함수를 작성해보겠습니다.
void repeat(void (*callback)(int), int count) {
for (int i = 0; i < count; i++) {
(*callback)(i);
}
}
void print_number(int num) {
printf("Number: %d\n", num);
}
int main() {
repeat(print_number, 5);
return 0;
}
마무리
이 포스팅에서는 함수 포인터의 기본적인 사용법과 몇 가지 예제를 살펴보았습니다. 함수 포인터는 함수를 변수처럼 다룰 수 있어서 매우 유용한 기능입니다. 함수 포인터를 적절히 활용하여 코드의 유연성과 재사용성을 높일 수 있습니다.
댓글