본문 바로가기
카테고리 없음

함수 포인터 사용법 & 예제 총정리

by kangs' tong 2023. 12. 11.

함수 포인터 사용법 & 예제 총정리

함수 포인터는 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;
}

마무리

이 포스팅에서는 함수 포인터의 기본적인 사용법과 몇 가지 예제를 살펴보았습니다. 함수 포인터는 함수를 변수처럼 다룰 수 있어서 매우 유용한 기능입니다. 함수 포인터를 적절히 활용하여 코드의 유연성과 재사용성을 높일 수 있습니다.

댓글