C 프로그래밍 · 2 min read · Nov 22, 2025

리눅스 C 프로그래밍 튜토리얼 25부 - 함수 포인터

지금까지 진행된 이 C 프로그래밍 튜토리얼 시리즈에서는 포인터의 기본 개념과 배열에 대한 포인터 및 포인터의 배열과 같은 포인터와 관련된 여러 측면에 대해 논의했습니다. 포인터에 대한 이해를 확장하기 위해, 이번 튜토리얼에서는 함수에 대한 포인터 개념에 대해 논의하겠습니다.

C 프로그래밍 언어의 함수 포인터

변수에 대한 포인터가 있는 것처럼, 함수에 대한 포인터도 있을 수 있습니다. 다음은 함수 포인터 선언의 예입니다:

void (*fn_ptr)(int)

여기서 우리는 ‘fn_ptr’이라는 함수 포인터를 정의했으며, 이는 void를 반환하고 정수를 입력으로 받는 모든 함수에 포인팅할 수 있습니다. 말할 필요도 없이, 이것은 선언 부분일 뿐입니다 - 다른 포인터와 마찬가지로, 이를 사용하려면 주소(이 경우 함수의 주소)를 할당해야 합니다.

다음은 이 포인터를 사용하는 예입니다:

#include   
  
void print_int(int a)  
{  
 printf("\n 정수 값은: %d\n",a);  
}  
  
int main()  
{  
 void (*fn_ptr)(int);  
 fn_ptr = &print_int;  
 (*fn_ptr)(10);  
  
 return 0;  
}

보시다시피, 우리는 먼저 정수를 입력으로 받고 void를 반환하는 ‘print_int’라는 함수를 정의했습니다. 그런 다음 ‘main’ 함수에서 ‘fn_ptr’을 ‘print_int’와 같은 함수에 포인팅할 수 있는 함수 포인터로 선언했습니다. 그 후 ‘print_int’ 함수의 주소를 ‘fn_ptr’에 할당하고, 마지막으로 포인터를 사용하여 함수를 호출했습니다.

다음은 생성된 출력입니다:

정수 값은: 10  

여기서 언급할 가치가 있는 것은 마지막 두 줄에서 &와 *를 피하여 이 프로그램을 더 간단하게 만들 수 있다는 것입니다. 다음은 수정된 코드입니다:

#include   
  
void print_int(int a)  
{  
 printf("\n 정수 값은: %d\n",a);  
}  
  
int main()  
{  
 void (*fn_ptr)(int);  
 fn_ptr = print_int;  
 fn_ptr(10);  
  
 return 0;  
} 

계속해서, 포인터의 배열처럼, 함수 포인터의 배열도 가질 수 있습니다. 예를 들어, 다음은 3개의 함수 주소를 저장할 수 있는 함수 포인터의 배열입니다.

void (*fn_ptr[3])(int)

다음은 이 포인터 배열을 사용하는 예입니다:

void print_int1(int a)  
{  
 printf("\n 정수 값은: %d\n",a);  
}  
  
void print_int2(int a)  
{  
 printf("\n 정수 값은: %d\n",a+1);  
}  
  
void print_int3(int a)  
{  
 printf("\n 정수 값은: %d\n",a+2);  
}  
  
int main()  
{  
 void (*fn_ptr[3])(int);  
   
 fn_ptr[0] = print_int1;  
 fn_ptr[1] = print_int2;  
 fn_ptr[2] = print_int3;  
   
 fn_ptr[0](10);  
 fn_ptr[1](10);  
 fn_ptr[2](10);  
  
 return 0;  
}

다음은 이 코드에서 생성된 출력입니다:

정수 값은: 10   
   
정수 값은: 11   
   
정수 값은: 12

함수 포인터에 대해 알아야 할 또 다른 측면은 함수 인수로 사용할 수 있다는 것입니다. 예를 들어, 함수 포인터를 인수로 받는 함수가 있을 수 있습니다. 예:

void some_random_func(void (*fn_ptr)(int)) 

다음은 이 함수를 활용한 예제 코드입니다:

#include   
  
void another_random_func(int a)  
{  
 printf("\n 입력된 정수는: %d\n", a);  
}  
  
void some_random_func(void (*fn_ptr)(int))  
{  
 fn_ptr(5);  
}  
  
int main()  
{  
 some_random_func(another_random_func);  
 return 0;  
}

여기서 우리는 ‘some_random_func’라는 함수를 만들었으며, 이는 입력으로 함수 포인터를 받습니다. 그런 다음 ‘main’에서 ‘another_random_func’의 주소를 인수로 사용하여 ‘some_random_func’를 호출했습니다. 그런 다음 포인터를 사용하여 ‘another_random_func’를 성공적으로 호출했습니다.

다음은 출력입니다:

입력된 정수는: 5  

결론

함수 포인터는 ‘콜백 메커니즘’을 생성하고자 할 때 유용할 수 있습니다(여기에서 자세히 읽어보세요). 그러나 그에 들어가기 전에 이 개념을 잘 이해하는 것이 좋습니다. 이 튜토리얼의 예제를 로컬 머신에서 시도해 보시기를 권장합니다(그리고 새로운 예제를 만들어 보세요). 의문이나 질문이 있는 경우 아래에 댓글을 남겨주세요.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.