ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 포인터로 함수 호출하기
    Computer Language/C 2007. 8. 24. 16:49
    728x90

    그 렇다면 함수 포인터를 사용하는 이유는 무엇일까? 앞 예제의 경우 함수 포인터를 통해 간접적으로 func 함수를 호출했는데 그냥 func(2)를 호출하는 것이 훨씬 더 간단하고 직관적인데 왜 굳이 함수 포인터가 필요한가 말이다. 물론 이유가 있는데 언제나 한 단계를 더 거치면 여러 가지 기법들이 가능해 진다.

    함수 포인터는 변수이기 때문에 조건에 따라 언제든지 다른 함수를 가리킬 수 있다. 물론 하나의 함수 포인터가 가리킬 수 있는 함수들의 원형은 모두 일치해야 한다. 함수 포인터를 인수로 사용하면 함수를 다른 함수에게 전달하는 것도 가능해지며 함수 퐁니터 배열이나 구조체를 통해 여러 개의 함수군을 통째로 바꿔치기 할 수 도 있다.

    함수 포인터의 가장 쉬운 응용예로 조건에 따라 함수를 바꿔 가며 호출하는 예제를 만들어 보자. 다음 에제에는 원형이 똑같은 multi2, multi3 두개의 함수가 있는데 사용자가 입력한 값에 따라 둘 중 하나의 함수를 호출한다.


    #include <Turboc.h>

    int multi2(int a)
    {
     return a*2;
    }

    int multi3(int a)
    {
     return a*3;
    }

    void main()
    {
     char ch;
     int i=5;
     int (*pf)(int a);
     printf("5를 두 배로 하고 싶으면 2, 세 배 하고 싶으면 3를 누르시오.\n");
     ch = getch();
     if(ch == '2')
      pf = multi2;
     else
      pf = multi3;
     printf("Result = %d\n", (*pf)(i));
    }


    multi2 는 입력값의 2배가 되는 값을 돌려주며 multi3는 3배가 되는 값을 돌려 주는데 두 함수는 원형이 동일하다. main에서는 이 두 함수를 가리킬 수 있는 함수 포인터를 pf를 선언하고 사용자의 입력에 따라 pf에 multi2, multi3중 하나를 대입해 둔다. 호출할 함수으 번지를 pf가 가지고 있으므로 (*pf)로 호출하기만 하면 선택된 함수가 호출될 것이다. 이 예제의 경우는 어디까지나 사용예를 보여줄 뿐 큰 실용성은 없는데 함수 포인터를 사용하는 대신 다음과 같이 코드를 작성해도 결과는 동일하다.


    if (ch == '2') {

       printf("결과는 %d입니다.\n", multi(2));

    else

       printf("결과는 %d입니다.\n", multi(3));


    예제가 짧고 간단하기 때문에 함수 포인터에 값을 대입하는 조건을 함수 호출문에 바로 사용할 수 있다. 그러나 다음과 같은 경우에는 함수 포인터를 사용하는 것이 더 좋다.


    1> 선택해야 할 함수가 두 개 이상인 경우, 예를 들어 수십개의 함수중 하나를 호출해야 한다면 함수 포인터 배열을 선언하고 그 첨자를 선택하는 것이 쉽다.


    2> 함수를 선택하는 시점과 실제로 호출하는 시점이 완전히 분리되어 있는 경우도 함수 포인터를 쓰는 것이 유리하다. 호출할 함수에 대한 조건 점검은 필요할 때 한번만 하고 선택된 함수는 별 다른 조건 점검없이 함수 포인터로 바로 호출할 수 있다.


    3> 호출할 함수가 DLL같은 외부  모듈에 있고 이 함수를 동적으로 연결할 경우는 컴파일할 때 함수의 존재가 알려지지 않으므로 반드시 함수 포인터를 사용해야 한다. 함수 퐁니터를 사용하면 이름으로부터 원하는 함수으 번지를 찾아 호출할 수 있다.


    함 수 포인터를 반드시 사용해야 하는 예는 아주 많다. 대표적으로 개방된 데이터베이스 환경인 ODBC를 들 수 있는데 ODBC는 다양한 데이터베이스 서버를 일관된 방법으로 다룰 수 있는 표준 인터페이스를 제공한다. 언제든지 드라이버를 바꾸기만 하면 ODBC 표준을 따르는 모든 데이터 베이스 서버를 엑세스 할 수 있다. 각 드라이버는 ODBC규약에 따라 미리 정해진 함수의 집합을 구현하며 ODBC 관리자는 응용 프로그램의 요구에 따라 드라이버의 함수를 찾아 호출하는데 이때 드라이버내의 함수 번지를 저장하기 위해 함수 포인터 배열이 사용된다.

    'Computer Language > C' 카테고리의 다른 글

    TR1(Tecnical Report1) 소개글  (0) 2008.12.08
    함수 포인터 인수  (0) 2007.08.24
    함수포인터 타입  (0) 2007.08.24
    [펌] 함수포인터 정의  (0) 2007.08.24
    [펌] 포인터 캐스팅을 이용한 실제 인터페이스 변경  (0) 2007.08.24

    댓글

Designed by black7375.