본문 바로가기
카테고리 없음

Function Pointer (함수 포인터)

by SuldenLion 2023. 3. 28.
반응형

C와 C++의 Function Pointer 제도에 대해서 무엇인지 알아보겠다.

 

Function Pointer란, 함수 포인터 즉, 변수가 아닌 함수를 가리키는 포인터를 뜻한다.

Function Pointer를 쓰는 이유로는 콜백 함수(Callback function = 어떤 이벤트에 의해 호출되어지는 함수, 다른 함수에 매개변수로 넘겨진 함수)를 구현할때 사용된다.

 

간단한 덧셈, 뺄셈, 곱셈, 나눗셈을 하고 싶을 때, 함수를 필요에 따라 그때 그때 불러오는 프로그램을 짜보며 자세히 보겠다.

#include <stdio.h>

void add(int x, int y)
{
	printf("%d + %d = %d\n", x, y, x+y);
}

void subtract(int x, int y)
{
	printf("%d - %d = %d\n", x, y, x-y);
}

void multiply(int x, int y)
{
	printf("%d * %d = %d\n", x, y, x*y);
}

void divide(int x, int y)
{
	printf("%d / %d = %d\n", x, y, x/y);
}

main()
{
	/*void (*f[4])(int,int);

	f[0] = add;
	f[1] = subtract;
	f[2] = multiply;
	f[3] = divide;

	while (1) {
		int n;
		int x, y;

		printf("What do you want? <1, 2, 3, 4>\n");
		scanf("%d", &n);
		printf("Type two data\n");
		scanf("%d %d", &x, &y);
		(*f[n-1])(x, y);
	}*/

	
	void (*f)(int,int);

	f = add;
	(*f)(30,40);

	f = subtract;
	(*f)(30,40);
}

각 연산을 출력해주는 함수를 만들고 메인에서 사용해보겠다.

 

이게 Function pointer를 사용하기 위한 정의이다. void의 포인터 타입이며 매개변수 두개의 형식을 명시해준다.

사용은 f에 함수명을 넣고 *f에 값을 넣고 호출해주면 된다.

출력 결과

 

보통 여러개의 함수를 배열같은 형태로 두고 관리하며 사용할 수 있다.

주석처리된 부분의 코드를 보겠다.

이런식으로 배열로써 함수 포인터를 정의해주고 각 요소에 함수명들을 넣어준다.

 

반복문을 돌면서 콘솔 창에 1번을 누르면 add를, 2번은 sub, 3번은 multiply, 4번은 div를 작동시켜보겠다.

1번을 누르고 숫자 두개를 입력하면 add함수의 출력문을 띄워준다.

 

다른 작업도 마찬가지이다. 미리 배열에 정해놓은 함수 포인터들을

이 코드로 호출이 가능한 것이다.

 

Function pointer의 원리는, 일반적인 포인터와 마찬가지로 메모리 주소를 가리킨다. 하지만 일반적인 포인터와 다르게 함수 포인터는 데이터가 아닌 코드의 위치를 가리킨다.

 

일반적으로 동적 할당을 한다면 HEAP 메모리에 포인터가 주소를 가리키고, static같은 전역변수나 Constant pool(상수 풀) 등의 데이터는 DATA영역에서 관리한다.

CODE 영역을 가리키는 함수 포인터는 메모리를 할당하거나 회수하는것이 불가능하다는 특징이 있다. 즉, Read-only이다.

 

또, 함수 포인터를 참조(referencing)나 역참조(dereferencing)해도 함수 포인터는 여전히 함수의 코드를 가리키는 포인터로써 동작한다.

이것들은 모두 같은 기능을 한다.

 

그리고 함수 포인터를 호출할 때 *와 괄호의 생략이 가능한데, 일반적인 함수 호출과 형태가 같아졌다. 

즉, add() 와 같은 함수들을 가리키는 add라는 함수의 이름도 사실 Function pointer이다.

반응형

댓글