|

C언어 함수 포인터 쉽게 정리: 콜백 개념으로 보면 왜 이해가 쉬울까

C언어 함수 포인터 쉽게 정리: 콜백 개념으로 보면 왜 이해가 쉬울까
함수 포인터는 함수를 값처럼 넘겨 다른 동작을 선택하게 만드는 구조다

C언어 함수 포인터는 선언문만 보면 겁이 나는 주제입니다. 별표와 괄호가 겹치고, 변수처럼 보이는데 함수와 연결되어 있어서 처음엔 구조가 잘 안 보입니다. 하지만 왜 필요한지부터 이해하면 훨씬 덜 어렵습니다.

이번 글에서는 함수 포인터를 문법 암기로 시작하지 않고, 콜백처럼 다른 함수를 나중에 선택해서 실행하는 구조로 설명하겠습니다.

C언어 함수 포인터 쉽게 정리 요약 카드
핵심을 빠르게 잡아주는 요약 카드

함수 포인터를 가장 짧게 설명하면

함수 포인터는 함수의 주소를 저장하는 포인터입니다. 즉 데이터 주소를 들고 있는 일반 포인터처럼, 함수도 주소를 통해 가리키고 나중에 호출할 수 있습니다.

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

int (*fp)(int, int) = add;
int result = fp(3, 4);

이 예시에서 fp는 int 두 개를 받아 int를 반환하는 함수를 가리킵니다. 즉 “어떤 함수를 쓸지”를 변수처럼 들고 다닐 수 있는 셈입니다.

C 포인터 설명을 보면 함수도 주소를 통해 가리킬 수 있다는 점이 나옵니다. 하지만 함수 포인터를 실제로 이해하려면 선언보다 사용 이유를 먼저 보는 편이 낫습니다.


왜 콜백 개념으로 보면 쉬워질까

콜백은 “지금 당장 함수 몸체를 고정하지 않고, 나중에 어떤 함수를 실행할지 넘겨받는다”는 구조입니다. 함수 포인터는 바로 이 구조를 C에서 구현하는 대표 방법입니다.

즉 함수 포인터를 보면 어려운 선언문보다, 동작을 나중에 바꿔 끼우는 도구라고 먼저 생각하는 편이 훨씬 이해가 쉽습니다.


정렬 비교 함수 예시로 보기

함수 포인터의 대표 예시는 비교 함수 전달입니다. 정렬 자체는 같은데, 오름차순으로 할지 내림차순으로 할지, 어떤 기준으로 비교할지를 함수로 바꿔 끼우는 식입니다.

즉 알고리즘 본체는 유지하면서 판단 규칙만 함수로 외부에서 주입하는 것입니다. 이 구조를 이해하면 함수 포인터가 갑자기 훨씬 실용적으로 보입니다.


이벤트나 처리 분기에서도 왜 유용할까

버튼 클릭, 데이터 수신, 작업 완료처럼 “어떤 일이 생겼을 때 나중에 실행할 동작”을 넘기고 싶을 때 콜백 구조가 자주 필요합니다. C에서는 이를 함수 포인터로 구현하는 경우가 많습니다.

void run(void (*action)(void)) {
    printf("before\n");
    action();
    printf("after\n");
}

void hello(void) {
    printf("hello\n");
}

이 구조에서 run은 동작 자체를 모르고, “나중에 실행할 함수 하나”만 받아서 호출합니다. 즉 함수 포인터 덕분에 실행 흐름과 구체 동작을 분리할 수 있습니다.


선언이 어려워 보이는 이유를 풀어서 읽기

int (*fp)(int, int) 선언이 무서운 이유는 별표와 괄호가 한 번에 보이기 때문입니다. 하지만 차근차근 읽으면 “fp는 포인터이고, 그 포인터가 int 두 개를 받아 int를 반환하는 함수를 가리킨다”는 뜻입니다.

즉 선언을 외우기보다, 변수 이름을 중심으로 보고 양옆을 해석하는 습관을 들이면 훨씬 덜 복잡합니다. 먼저 fp가 포인터라는 점을 보고, 그 다음 가리키는 대상이 함수라는 점을 읽으면 됩니다.


실전에서 어디에 자주 쓰일까

  • 정렬 비교 함수 전달
  • 이벤트 발생 시 호출할 함수 지정
  • 상황에 따라 다른 처리 함수 선택
  • 간단한 전략 교체 구조 구현

즉 함수 포인터는 포인터 문법 연습용이 아니라, “동작을 값처럼 다루고 싶을 때” 실제 의미가 생깁니다.


C언어 함수 포인터 쉽게 정리 흐름 그림
핵심 흐름을 그림으로 다시 정리한 이미지

자주 하는 오해

  • 함수 포인터는 고급 최적화 문법이라고만 생각한다
  • 선언 모양만 외우고 왜 필요한지는 놓친다
  • 콜백 구조를 이해하지 못해 사용 예시를 외워서만 본다
  • 일반 포인터와 함수 포인터를 완전히 다른 세계처럼 느낀다

포인터 기초는 포인터 입문 글, 메모리 수명과 포인터 감각은 malloc/free 글과 이어서 보면 더 이해가 잘 됩니다.


마무리

C언어 함수 포인터를 이해하는 핵심은 어려운 괄호 모양을 외우는 것이 아니라, 왜 함수를 나중에 선택해서 실행하고 싶은지를 먼저 이해하는 데 있습니다.

즉 함수 포인터는 문법 공포의 대상이 아니라, 함수를 값처럼 넘겨 동작을 바꿔 끼우는 구조로 보면 훨씬 덜 낯설어집니다.

함께보면 좋은 글