함수 포인터를 왜 사용하고 언제 유용하게 사용하는지 알아보자.
1. Call Back 함수로 사용
Call back은 '다시 받는다'라는 뜻이다. 우리가 기본적으로 함수를 선언해 사용하게 되면 사용하는 그 시점에 기능이 수행된다. 하지만 function pointer를 활용하면 그림과 같이 DLL에서 자신이 선언한 함수가 DLL 수행 시점에 실행되게 된다. 이를 Async라고 표현하는데 이에 대한 설명은 '여기'에 잘 설명되어 있다.
SUDO 코드를 예로 보자.
Main Processor에서 생성한 function_pointer(int count)라는 함수를 DLL에 함수 포인터로 넘겨주고 이를 DLL Run_MainProcess에서 실행하게 된다. 이때 실행되는 함수의 원본은 Main Processor에 있기 때문에 function_pointer(int count) 함수가 실행된다.
이를 정리해 보면 function_pointer(int count)함수가 실행되는 시점은 Main Processor 동작이 아닌 DLL에서 실행하는 시점이 된다는 것이다. 이는 꼭 DLL 뿐만 아니라 다른 Class나. c,. cpp 파일에서 수행될 수 있으므로 활용성은 방대하다.
2. Switch 대신 사용
Switch 문의 Case가 증가할수록 Case n에 접근하기 위해선 기존 상위 case를 모두 거쳐야만 도달하게 된다. 이는 데이터 실시간 처리나 하드웨어 자원이 한정적인 곳에서는 치명적인 로드를 발생 시킬 수 있다. 이를 해결할 방법은 없을까?
결론부터 이야기하면 함수포인터를 배열에 넣어서 사용하면 된다.
하기 이미지와 같이 (*Function_Pointer_Array[n])()을 선언하고 각 배열에 함수 포인터를 입력하면 된다. 배열의 Index는 Case 문의 n이기 때문에 해당 인덱스로 배열에 바로 접근하면 된다. Index를 Enum type으로 만들면 가독성이 더 늘어날 것이다.
3. Map에 활용
위의 사용예와 같이 Map에 넣어서 활용하면 특정 Key에 따른 Function Pointer를 받아와 동적으로 함수를 실행할 수 있게 만들어주고 새로운 Key에 따른 기능 추가를 쉽게 해 준다. 이와 같은 기능을 디자인 패턴과 함께 사용하면 코드의 재사용성을 Up 할 수 있다.
아래 포스팅을 통해 함수 포인터 사용방법을 알아보자
2020/10/22 - [programmer] - 함수 포인터 기본 사용법과 매개변수, 리턴
'programmer > Programming' 카테고리의 다른 글
원형 큐(circuit queue) 예제 (0) | 2020.10.21 |
---|---|
Pthread 개념 및 예제 (0) | 2020.10.21 |
C 언어 Bit field 배열- 최소 메모리로 flag 저장하기 (0) | 2020.06.23 |