함수 포인터 기본 사용법과 간단한 활용 예를 알아보자. 예제는 C++, C에서도 동일하게 사용 가능하다.
1. 함수 포인터 기본 사용법
함수 포인터 선언 방법은
반환 값 (*함수포인터이름)(매개변수 타입); 으로 이루어진다.
예) void (*m_work_handler)(int inputData);
아래 예제를 보자. 함수 포인터를 만들고 정의하기 위해서 라이브러리 개발자가 고심한 것이 눈에 보인다. 함수 앞에 그냥 *만 사용하면 void *와 헷갈리기 때문에 어쩔 수 없이 () 괄호로 묶어야 했을 것이다. 이런 고충을 생각하면서 외우면 잘 기억난다. 함수 포인터도 함수기 때문에 꼭 매개변수 타입을 지정해 주어야 한다.
//함수 포인터 선언
void (*m_work_handler)(int inputData);
2. 함수 포인터 사용 예
m_work_handler에 move_to_box함수를 집어넣고 m_work_handler를 실행하면 move_to_box 함수가 실행되는 것을 알 수 있다.
//함수 포인터 선언
void (*m_work_handler)(int inputData);
//기본 함수 선언(함수 포인터 매개변수 리턴타입과 맞추어 선언합니다.)
void move_to_box(int speed);
void main()
{
//함수 포인터(m_work_handler)에 move_to_box 함수 집어 넣기
m_work_handler = move_to_box;
m_work_handler(100);
}
void move_to_box(int speed)
{
//작업 내용
printf("상자를 %d 속도로 옮깁니다.",speed);
}
==========out============
상자를 100 속도로 옮깁니다.
이를 좀 더 활용해 보자.
m_work_handler 함수 포인터에 함수만 바꾸어주면 동일한 함수 포인터로 다른 함수를 수행할 수 있다. 이 예제를 좀 더 활용하면 제사 용성을 높이는 코드를 개발할 수 있다.
//함수 포인터 선언
void (*m_work_handler)(int inputData);
//기본 함수 선언(함수 포인터 매개변수 리턴타입과 맞추어 선언합니다.)
void move_to_box(int speed);
void main()
{
//함수 포인터(m_work_handler)에 move_to_box 함수 집어 넣기
m_work_handler = move_to_box;
m_work_handler(100);
m_work_handler = throw_away_the_box;
m_work_handler(50);
}
void move_to_box(int speed)
{
//작업 내용
printf("상자를 %d 속도로 옮깁니다. \n",speed);
}
void throw_away_the_box(int speed)
{
//작업 내용
printf("상자를 %d 속도로 버립니다. \n",speed);
}
==========out============
상자를 100 속도로 옮깁니다.
상자를 50 속도로 버립니다.
3. 함수 포인터 매개변수 및 반환 예
함수 포인터를 매개변수로 전달하거나 return 값으로 반환이 가능하다. 이를 C++ Class를 사용해서 설명해 본다
Robot class는 m_work_handler이라는 함수 포인터를 가지고 있고 이 함수 포인터를 set(설정)해주거나 get(반환)하는 함수를 가지고 있다.
class Robot
{
private:
void (*m_work_handler)(int inputData);
public:
//함수 포인터 매개변수 사용
void set_work_handler(void (*inn_m_work_handler)(int inputData))
{
m_work_handler = inn_m_work_handler;
}
//함수 포인터 리턴 사용
void (*get_work_handler())(int inputData)
{
return m_work_handler;
}
};
3.1 매개변수로 사용될 때
매개변수로 사용될 때는 기존 함수 포인터를 선언했던 것 그대로 매개변수 위치에 입력해 주면 된다.
기본 함수 선언 방법:
리턴 타입 함수이름(매개변수)
함수포인터 매개변수 선언 방법:
리턴타입 함수이름(함수포인터_반환타입 (*매개변수로 사용할 함수포인터 이름)(함수포인터_매개변수))
public:
void set_work_handler(void (*inn_m_work_handler)(int inputData))
{
m_work_handler = inn_m_work_handler;
}
3.2 리턴으로 사용될 때
이 경우가 조금 특이한데 기존 함수 포인터 이름 지정은 필요 없어지기 때문에 제거되고 반환 타입과 매개변수 타입만 남게 된다. 설명보다는 아래 '함수포인터 매개변수 선언 방법'을 보자.
함수포인터 매개변수 선언 방법:
함수포인터_반환타입 (*함수이름(매개변수))(함수포인터_매개변수)
public:
void (*get_work_handler())(int inputData)
{
return m_work_handler;
}
예제를 통해 한번 따라 하고 외우거나 헷갈리면 선언 방법을 숙지해서 사용하는게 좋을 듯하다.