C 언어 함수포인터 개념과 사용이유

임시온·2023년 7월 11일
0
post-thumbnail

c언어 함수 포인터

간단하게 설명하면 함수의 주소를 저장하는 포인터이다. 변수를 선언을 하면 메모리에 공간이 할당되듯이 함수도 선언을 하면 메모리가 할당이 되기 때문에 주소를 이용하여 함수를 가르킬 수 있다.

선언 방법

int (*pointer_sum)(int, int) = sum;

자료형 (*포인터 함수이름)(매개변수 타입) = 가르키고자 하는 함수이름;
함수의 주소를 넣는 것이기 때문에 sum() 이렇게 말고 이름만 넣음(그러면 주소 나옴)

사용 방법

#include <stdio.h>

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

int main() {
	// 포인터 함수 선언 후 주소 넣기
     int (*pointer_sum)(int,int) = sum;
    
    printf("%d\n", pointer_sum(1, 2));
    // 3
}

만약 매개변수가 여러개라면 선언할 때도 여러개 넣어주면 됨

함수 포인터 배열

간단하게 그냥 배열 만들어서 사용하면 됨
#include <stdio.h>

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 div(int a, int b) {
	return a/b;
}

int main() {
	// 함수 포인터 배열 선언
	int (*pointer_fun[4])(int, int);
    
    // 함수 시작 주소 넣기
    pointer_fun[0] = add;
    pointer_fun[1] = sub;
    pointer_fun[2] = mul;
	pointer_fun[3] = div;
    
    printf("%d\n", pointer_fun[0](4, 2)); // 6
    printf("%d\n", pointer_fun[1](4, 2)); // 2
    printf("%d\n", pointer_fun[2](4, 2)); // 8
    printf("%d\n", pointer_fun[3](4, 2)); // 2
    
	return 0;
}

사용이유??

1. callback 함수 구현가능

callback 함수란 다른 함수 내에서 호출되는 함수로, 이벤트 처리, 정렬 알고리즘 등 다양하게 사용됨.

2. 동적 바인딩

실행 중에 동적으로 함수를 선택하고 변경해야하는 경우, 예를 들어 프로그램이 사용자 입력에 따라 다른 동작을 수행해야 하는 경우에 포인터 함수를 사용하면 동적으로 선택 및 호출 가능, 왜냐하면 함수 포인터는 실행 중에 함수의 주소를 저장하고 해당 주소에 대해 호출을 수행하기 때문에 동적으로 변경 가능. 여기서 함수의 주소를 저장하는 부분이 동적 바인딩이라서 코드가 컴파일 된 이후 실행될 때 함수의 주소가 저장됨.

3. 효율성

자주 사용하는 함수의 시작 주소들을 함수포인터 배열에 저장을 해서 호출하면 일반적인 함수 호출보다 빠른 속도로 호출함.

4. 가능성

함수명을 사용하여 함수를 호출하는 기본적인 방법은 호출할 함수가 컴파일 시에 결정되어야 한다.(정적 바인딩이기 때문에) 그렇기에 동시에 호출할 함수를 실행할 때에 동적으로 변경이 불가능하기에 프로그램의 가능성을 크게 제한한다. 하지만 함수 포인터를 사용한다면 운영체제로 동적으로 호출이 가능하다.(운영체제가 대신 호출해줌) 동적으로 호출이 가능하다면 유연성있는 시스템을 구축할 수 있다.

주의사항

사용중인 함수포인터가 어떤 것을 가르키고 있는지를 잘 살펴보아야 한다. 만약 NULL을 가르키고 있는건 아닌지 확인을 해보는게 좋음.

참고 자료

profile
🐧 끈기 있는 개발자

0개의 댓글