본문 바로가기

programmer

함수 포인터 기본 사용법과 매개변수, 리턴

함수 포인터 기본 사용법과 간단한 활용 예를 알아보자. 예제는 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;
    }

예제를 통해 한번 따라 하고 외우거나 헷갈리면 선언 방법을 숙지해서 사용하는게 좋을 듯하다.

반응형
사업자 정보 표시
라울앤알바 | 장수호 | 서울특별시 관악구 봉천로 13나길 58-10, 404호(봉천동) | 사업자 등록번호 : 363-72-00290 | TEL : 010-5790-0933 | Mail : shjang@raulnalba.com | 통신판매신고번호 : 2020-서울관악-0892호 | 사이버몰의 이용약관 바로가기