함수포인터

2009.11.12 07:27

가을의 곰을... 조회 수:7398

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

함수포인터


설명 #

"함수포인터"는 C언어에서 자주 쓰이는 기본 용법중 하나입니다. 정의는 다음과 같습니다.
선언된 함수가 저장된 메모리 번지값을 담고 있는 포인터 변수
하지만 이것을 왜 보통의 포인터와는 달리 특별취급하냐면 다음과 같은 이유 때문입니다.
  1. 일반 포인터 변수와는 조금 다르게 보이는 문법으로 선언됩니다. 예를 들어 함수 포인터 변수는 다음과 같이 선언합니다. (functionPtr이 포인터 변수명이 됩니다)
    void (*functionPtr)(const char *s_)
    
  2. 함수포인터는 실행부분을 가리키는 포인터 변수인탓에 () 연산자를 사용할 수 있습니다. 즉, 위의 functionPtr은 아래와 같이 실행가능합니다.
    functionPtr("바보나라~")
    


주로 함수포인터는 콜백(callback)을 구현하는데 사용됩니다. 어떤 라이브러리를 제작할 때 개발자가 어떤 "경우"에 대한 반응을 함수로 작성하고 이를 다시 라이브러리에서 호출하도록 작성하고자 할 때, 개발자가 작성한 함수의 포인터를 넘겨받아 실행하도록 하면 아주 유용할 때가 많습니다. (대표적인 예가 win32 api에서 윈도우 프로시져를 WNDCLASS의 lpfnWndProc맴버에 등록하는 부분을 들 수 있습니다) 즉, 함수를 마치 변수와 같이 취급하는 것이 가능해집니다.

예제 #

아래 예제는 함수포인터를 활용한 간단한 예제입니다.

#include <stdio.h>

void testout1(const char *s) {
  printf("시험출력1:%s\n", s);
}

void testout2(const char *s) {
  printf("시험출력2:%s\n", s);
}

// 함수포인터 변수
void (*funcPtr)(const char *s);

int main() {
  // 함수포인터를 testout1, testout2로 각각 대입해보고 실행해본다.
  funcPtr = testout1;
  funcPtr("테스트");
  funcPtr = testout2;
  funcPtr("테스트");
}
실행결과는 아래와 같습니다.
시험출력1:테스트
시험출력2:테스트
main()안에서는 funcPtr만 실행했지만 마치 testout1, testout2를 각각 실행한 것과 같은 효과가 있음을 알 수 있습니다.

typedef 거는 법 #

함수포인터를 어떤 포인터 변수로서 활용하고 싶을 때 typedef를 활용하면 매우 편리합니다. 실제로 win32 API에서는 윈도우 프로시저 함수포인터형으로 WNDPROC라는 타입이 있습니다. (이부분을 보면 어느정도 사용법에 대한 느낌이 올겁니다) winuser.h 헤더화일에서 검색해보면 다음과 같이 선언되어있습니다.
typedef LRESULT(CALLBACK *WNDPROC)(HWND,UINT,WPARAM,LPARAM);

실제로 사용될 때에는 다음과 같이 사용됩니다.
LRESULT CALLBACK winproc1(HWND,UINT,WPARAM,LPARAM) { };
...
WNDPROC winprocPtr = winproc1;
...
꽤 유용한 문법이니 알아두시면 좋습니다.

주의사항 #

함수포인터는 알아두면 상당히 유용한 기법이지만 사용시에는 다음과 같은 부분을 주의해야합니다.
  1. 대입되지 않은 (NULL값상태의) 함수포인터를 실행하지 않도록 주의해야합니다. 초기화를 항상 NULL로 해두고 실행전에 검사하는 것도 좋은 방법입니다.
  2. "같은 함수 포인터 타입"이라는 것을 증명하려면, 반환값, 매개변수의 타입 및 개수가 모두 일치해야합니다. 보통 하나라도 다른 함수포인터값을 대입하면 컴파일시 오류가 나게 됩니다.
본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
32 [알아봅시다] 온라인 광고의 진화 file 가을의 곰을... 2011.10.09 2336
31 [알아봅시다] OTT(Over-The-Top) file 가을의 곰을... 2011.10.09 2348
30 [알아봅시다] 클라우드 컴퓨팅 미래 file 가을의 곰을... 2011.10.09 2172
29 [알아봅시다] 데스크톱 가상화 file 가을의 곰을... 2011.10.09 2276
28 [알아봅시다] ISGAN file 가을의 곰을... 2011.05.28 2672
27 [알아봅시다] 권한접근관리(PAM) file 가을의 곰을... 2011.05.28 2528
26 [알아봅시다] 전자정부 표준프레임워크 file 가을의 곰을... 2011.05.28 3098
25 [알아봅시다] 주요 국가의 스마트카 산업 file 가을의 곰을... 2011.05.28 2529
24 [알아봅시다] 스마트그리드 표준화 file 가을의 곰을... 2011.05.28 2481
23 게임시나리오 작가 file 가을의 곰을... 2010.08.22 3720
22 게임 시나리오 작법 가을의 곰을... 2010.08.22 4145
21 컴퓨터 게임/ 게임 시나리오 file 가을의 곰을... 2010.08.22 5373
20 게임시나리오 작성팁 (http://weowulf.egloos.com/183472) 가을의 곰을... 2010.08.22 5664
19 게임 서버의 구조 file 가을의 곰을... 2010.01.23 6489
18 [알아봅시다] 스마트 그리드(Smart Grid) file 가을의 곰을... 2010.01.23 4773
» 함수포인터 file 가을의 곰을... 2009.11.12 7398
16 [알아봅시다] 교육의 틀을 바꾸는 `디지털교과서` file 가을의 곰을... 2009.09.20 6660
15 [알아봅시다] 이북(e-book) 단말기 file 가을의 곰을... 2009.09.05 6218
14 [알아봅시다] 파장분할다중화 수동광통신망(WDM-PON) file 가을의 곰을... 2009.09.04 5286
13 [알아봅시다] 나만의 무선 랜 `마이파이` file 가을의 곰을... 2009.09.04 6452
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED