함수 포인터

함수 포인터는 프로그래밍 언어에서 함수 자체를 가리키는 포인터(주소)를 의미한다. 주로 C·C++와 같은 절차적 언어에서 사용되며, 런타임에 호출될 함수를 동적으로 결정할 수 있게 해준다. 함수 포인터는 함수의 시그니처(반환형과 매개변수 목록)와 일치하는 타입을 갖으며, 이를 통해 함수 호출 연산자 ()를 이용해 실제 함수를 실행한다.

정의

함수 포인터는 “함수의 주소를 저장하는 포인터”라는 의미로, 다음과 같은 형식으로 선언된다.

return_type (*pointer_name)(parameter_type1, parameter_type2, ...);
  • return_type : 함수가 반환하는 값의 타입
  • pointer_name : 포인터 변수의 이름(괄호와 *가 필수)
  • parameter_typeX : 함수가 받는 매개변수들의 타입

선언된 함수 포인터는 해당 시그니처를 가진 어떠한 함수의 주소라도 저장할 수 있다.

역사

함수 포인터는 C 언어의 초기 설계 단계부터 포함되었다. C 표준 ANSI C (1989) 및 ISO C (1990)에서 공식적으로 지원되었으며, 이후 C++에서도 동일한 방식으로 사용 가능하도록 유지되었다. 함수 포인터는 콜백 메커니즘, 이벤트 처리, 플러그인 구조 등 다양한 시스템 프로그래밍 패턴에서 핵심 역할을 수행한다.

문법 및 사용법

선언 및 초기화

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

int (*fp)(int, int) = add;   // 함수 포인터 fp에 add 함수의 주소를 저장

호출

int result = fp(3, 4);   // fp가 가리키는 함수 add를 호출, result = 7

배열 및 구조체와의 결합

int (*ops[3])(int, int) = { add, sub, mul };   // 함수 포인터 배열
struct Handler {
    void (*callback)(void *);
};

콜백 함수 예시

void sort(void *base, size_t n, size_t size,
          int (*compar)(const void *, const void *));

qsort와 같은 표준 라이브러리 함수는 정렬 기준을 지정하기 위해 함수 포인터를 매개변수로 받는다.

주요 언어별 구현

언어 지원 여부 주요 특징
C O 표준 C에서 직접 지원, 함수 포인터와 typedef를 결합해 가독성을 높일 수 있음
C++ O C와 동일하게 사용 가능, std::function과 람다 표현식으로 대체되는 경우 증가
Java X 함수 포인터 개념이 없으며, 대신 인터페이스나 람다(함수형 인터페이스) 사용
C# X 직접적인 포인터 사용이 제한되나, delegate 타입이 함수 포인터와 유사한 역할 수행
Rust O (unsafe) extern "C" 함수 포인터는 안전하게 사용 가능, 일반 함수 포인터는 unsafe 블록 필요

장점

  • 동적 바인딩: 실행 시점에 호출할 함수를 결정할 수 있어 플러그인·모듈식 설계에 유리.
  • 콜백 구현: 라이브러리 함수에 행동을 정의하는 콜백을 전달 가능.
  • 코드 재사용: 동일한 인터페이스를 갖는 여러 함수를 동일한 로직으로 다룰 수 있다.

단점

  • 가독성 저하: 선언 구문이 복잡해 초보자에게 어려울 수 있다.
  • 타입 안전성: 잘못된 시그니처의 함수 주소를 할당하면 정의되지 않은 동작이 발생한다.
  • 디버깅 어려움: 간접 호출을 통해 실행 흐름을 추적하기 어려운 경우가 있다.

관련 개념

  • 콜백 함수: 함수 포인터를 매개변수로 받아 특정 시점에 호출되는 함수.
  • 람다 표현식: C++11 이후 함수 포인터를 대체하거나 std::function과 함께 사용.
  • 함수 객체(함수 객체, Functor): 객체 형태로 함수 호출 연산자를 구현한 것.
  • 디스패치 테이블: 다형성을 구현하기 위해 함수 포인터 배열을 활용하는 기법.

참고문헌

  1. ISO/IEC 9899:1999, “Programming languages — C”.
  2. B. Stroustrup, The C++ Programming Language, 4th ed., Addison‑Wesley, 2013.
  3. R. Kernighan, D. Ritchie, The C Programming Language, 2nd ed., Prentice Hall, 1988.

(위 내용은 공개된 표준 문서와 교과서 등을 기반으로 작성되었으며, 추가적인 최신 자료는 각 언어의 공식 문서를 참고할 수 있다.)

둘러보기

더 찾아볼 만한 주제