C언어에서 함수 포인터와 함수 포인터 배열을 사용하여 유연하고 다양한 기능을 구현할 수 있습니다. 이러한 개념을 사용하여 구조체를 만들고 구조체 멤버로 함수 포인터를 선언하고 활용하는 방법에 대해 알아봅시다.
함수 포인터
함수 포인터는 함수의 주소를 가리키는 포인터입니다. 함수 포인터를 사용하면 실행 시간에 동적으로 함수를 지정할 수 있습니다. 함수 포인터를 선언하려면 반환 유형과 매개 변수 유형을 지정해야 합니다. 예를 들어, int
를 반환하고 int
매개 변수를 갖는 함수의 포인터는 다음과 같이 선언됩니다.
int (*ptr)(int);
이제 이 함수 포인터를 사용하여 다양한 함수를 가리킬 수 있습니다.
함수 포인터 배열
함수 포인터 배열은 함수 포인터의 배열입니다. 여러 함수를 배열에 저장하고 필요할 때 호출할 수 있습니다. 함수 포인터 배열을 선언하려면 함수 포인터의 배열을 만들고 각 요소를 특정 함수에 할당해야 합니다.
int (*arr[3])(int) = {func1, func2, func3};
위의 예제에서 func1
, func2
, func3
은 int
를 반환하고 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;
}
위의 예제에서 emp1
과 emp2
는 각각 add
함수와 subtract
함수를 가리키는 calculate
멤버를 갖는 구조체입니다. emp1.calculate(10, 5)
는 add(10, 5)
를 호출하고 emp2.calculate(10, 5)
는 subtract(10, 5)
를 호출합니다.
이러한 방식으로 함수 포인터와 함수 포인터 배열을 사용한 구조체를 통해 유연한 프로그래밍이 가능합니다.
이상으로 함수 포인터와 함수 포인터의 배열을 사용한 구조체에 대해 알아보았습니다.
참고 문헌:
- https://www.learn-c.org/en/Function_Pointers
- https://www.geeksforgeeks.org/function-pointer-in-c/
- https://www.tutorialspoint.com/cprogramming/c_function_pointer.htm