C언어의 고급 기능 중 하나인 함수 포인터(Function Pointer)는, 함수를 포인터로 가리켜서 함수를 동적으로 선택하거나 전달할 수 있는 강력한 도구입니다.
처음 접하면 굉장히 생소하고 복잡해 보이지만, 원리를 알고 나면 아주 유용하게 사용할 수 있습니다. 특히 콜백 함수, 함수 배열, 전략 패턴 구현 등에서 많이 사용됩니다.
📌 함수도 메모리에 저장된다?
모든 함수도 메모리 어딘가에 저장됩니다. 따라서 함수의 주소를 변수에 저장할 수 있고, 이 변수를 통해 함수를 호출할 수 있습니다.
int add(int a, int b) {
return a + b;
}
위 함수는 add라는 이름을 가지고 있지만, 사실 add는 함수의 시작 주소를 의미합니다. 따라서 아래와 같은 표현도 가능합니다.
int (*fp)(int, int); // 함수 포인터 선언
fp = add; // 함수 포인터에 주소 저장
📌 함수 포인터 선언 문법
함수 포인터는 다음과 같이 선언합니다:
반환형 (*포인터이름)(매개변수형식들);
int (*funcPtr)(int, int); // int형 인자 2개 받고, int형 반환
여기서 (*funcPtr)이 핵심입니다. 괄호를 빼면 반환형 함수 선언이 되어버리니 주의하세요!
📌 함수 포인터 사용 예제
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int (*fp)(int, int); // 함수 포인터 선언
fp = add; // 함수 주소 대입
int result = fp(3, 5); // 함수 호출
printf("결과: %d\n", result); // 8
return 0;
}
✅ fp(3, 5)는 add(3, 5)와 동일합니다.
📌 함수 포인터를 함수에 전달하기
함수 포인터는 다른 함수의 매개변수로 전달할 수 있습니다. 이 방식은 특히 **콜백 함수(callback)**로 활용됩니다.
void compute(int x, int y, int (*op)(int, int)) {
printf("결과: %d\n", op(x, y));
}
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int main() {
compute(10, 5, add); // 15
compute(10, 5, sub); // 5
return 0;
}
✅ 이처럼 함수 이름만 넘기면 함수 포인터로 전달됩니다!
📌 함수 포인터 배열
여러 개의 함수를 배열로 묶어서 필요할 때마다 선택적으로 호출할 수도 있습니다.
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int main() {
int (*ops[3])(int, int) = {add, sub, mul};
for (int i = 0; i < 3; i++) {
printf("연산 결과: %d\n", ops[i](10, 2));
}
return 0;
}
- ops[0] → add
- ops[1] → sub
- ops[2] → mul
함수를 배열처럼 관리할 수 있어서 확장성과 유지보수에 큰 도움이 됩니다.
📌 typedef로 함수 포인터 간단히 선언하기
함수 포인터는 문법이 길고 복잡하니 typedef로 간단히 만들어두면 좋습니다.
typedef int (*Operation)(int, int);
int add(int a, int b) { return a + b; }
int main() {
Operation op = add;
printf("%d\n", op(7, 3)); // 10
return 0;
}
가독성이 훨씬 좋아지죠?
📌 함수 포인터는 어디에 쓰이나요?
콜백 함수 | 예: 정렬 함수에 비교 함수를 인자로 전달 |
동적 실행 | 런타임에 실행할 함수 선택 가능 |
전략 패턴 | 여러 알고리즘 중 하나를 선택 실행 |
이벤트 핸들링 | 사용자 이벤트에 따라 함수 호출 다르게 설정 |
함수 배열 | 메뉴 시스템이나 명령 처리기에서 유용 |
✅ 정리하며
함수 포인터는 어렵지만, 알고 나면 정말 유용한 기능입니다.
- 함수도 주소를 가질 수 있다
- 함수 포인터를 선언하고 함수 주소를 저장할 수 있다
- 이를 통해 함수 호출을 동적으로 제어할 수 있다
- typedef와 배열을 함께 사용하면 더욱 유연한 구조가 가능하다
처음엔 int (*fp)(int, int) 같은 문법이 낯설겠지만, 몇 번 직접 써보다 보면 금방 익숙해집니다!
👀 포인터와 관련한 다른 포스팅이 궁금하다면 아래의 글을 추천해요
[C언어] 포인터(Pointer) - 정보처리기사 실기 준비
정보처리기사 실기 준비하면서 C언어의 개념을 간단하게 잡기 위해 공부하고 있는데요. 자료구조나 연산자 등은 자바와 비슷한 맥락이기 때문에 저는 바로 포인터 개념부터 시작했습니다.C언어
dev-yeonwha.tistory.com
[C언어] 배열과 포인터의 관계
C언어를 배우다 보면 배열과 포인터가 비슷한 것처럼 느껴질 때가 많습니다. 실제로 이 둘은 밀접한 관련이 있지만, 동일한 개념은 아닙니다. 오늘은 그 차이와 관계를 정리해볼게요. 📌 배열
dev-yeonwha.tistory.com
[C언어] 이중 포인터(Double Pointer) 정리
C언어에서 포인터도 어렵지만, 그 위에 포인터를 또 가리키는 이중 포인터(double pointer)는 진입 장벽이 훨씬 높습니다. 하지만 이중 포인터는 고급 C프로그래밍, 동적 메모리 할당, 다차원 배열 처
dev-yeonwha.tistory.com
'C' 카테고리의 다른 글
[C언어] 이중 포인터(Double Pointer) 정리 (0) | 2025.03.26 |
---|---|
[C언어] 배열과 포인터의 관계 (0) | 2025.03.26 |
[C언어] 포인터(Pointer) - 정보처리기사 실기 준비 (0) | 2025.03.25 |