[c언어] 함수 포인터와 함수 포인터의 배열을 사용한 구조체

C언어에서 함수 포인터와 함수 포인터 배열을 사용하여 유연하고 다양한 기능을 구현할 수 있습니다. 이러한 개념을 사용하여 구조체를 만들고 구조체 멤버로 함수 포인터를 선언하고 활용하는 방법에 대해 알아봅시다.

함수 포인터

함수 포인터는 함수의 주소를 가리키는 포인터입니다. 함수 포인터를 사용하면 실행 시간에 동적으로 함수를 지정할 수 있습니다. 함수 포인터를 선언하려면 반환 유형과 매개 변수 유형을 지정해야 합니다. 예를 들어, int를 반환하고 int 매개 변수를 갖는 함수의 포인터는 다음과 같이 선언됩니다.

int (*ptr)(int);

이제 이 함수 포인터를 사용하여 다양한 함수를 가리킬 수 있습니다.

함수 포인터 배열

함수 포인터 배열은 함수 포인터의 배열입니다. 여러 함수를 배열에 저장하고 필요할 때 호출할 수 있습니다. 함수 포인터 배열을 선언하려면 함수 포인터의 배열을 만들고 각 요소를 특정 함수에 할당해야 합니다.

int (*arr[3])(int) = {func1, func2, func3};

위의 예제에서 func1, func2, func3int를 반환하고 int 매개 변수를 갖는 함수입니다.

함수 포인터와 구조체

이제 함수 포인터와 함수 포인터 배열의 개념을 사용하여 구조체에 함수 포인터를 멤버로 추가할 수 있습니다.

typedef struct {
    int id;
    char *name;
    int (*calculate)(int, int);
} Employee;

위의 예제에서 Employee 구조체는 id, name, calculate 라는 멤버를 갖습니다. calculate 멤버는 int를 반환하고 int 매개 변수를 갖는 함수를 가리키는 함수 포인터입니다.

예제

이제 구조체의 함수 포인터 멤버를 사용하여 다양한 연산을 수행하는 간단한 예제를 살펴봅시다.

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

int main() {
    Employee emp1 = {1, "John", add};
    Employee emp2 = {2, "Doe", subtract};
    
    printf("Employee 1: %d\n", emp1.calculate(10, 5)); // Output: 15
    printf("Employee 2: %d\n", emp2.calculate(10, 5)); // Output: 5
    
    return 0;
}

위의 예제에서 emp1emp2는 각각 add 함수와 subtract 함수를 가리키는 calculate 멤버를 갖는 구조체입니다. emp1.calculate(10, 5)add(10, 5)를 호출하고 emp2.calculate(10, 5)subtract(10, 5)를 호출합니다.

이러한 방식으로 함수 포인터와 함수 포인터 배열을 사용한 구조체를 통해 유연한 프로그래밍이 가능합니다.

이상으로 함수 포인터와 함수 포인터의 배열을 사용한 구조체에 대해 알아보았습니다.

참고 문헌: