함수 포인터 사용하기


한가지 이름의 함수에 여러가지 동작을 수행하게 할 수 있다.

아래와 같은 클래스가 있다고 보자

[CODE type=cpp]class class_A {
public:
int (*test)(int a)
};[/CODE]


A라는 클래스안에 test란 포인터형 함수가 있다.

지금까지 선언하던 함수랑은 살짝 다르다...

다음과 같은 경우를 보자.

[CODE type=cpp]int *test(int a);[/CODE]


이 함수의 세부 사항을 보면

함수이름 : test
매개변수 : int a
반환형식 : int *


이런 뜻이 된다. 그렇다면 아까와 같이 괄호를 치면 어떤 의미가 될 것인가.

[CODE type=cpp]int (*test)(int a);[/CODE]

함수이름 : *test
매개변수 : int a
반환형식 : int

그렇다 함수앞에 *(포인트)가 붙은 것이다.

그렇다면 이런 것을 어떻게 사용할까?

아래의 예제를 보자.


[CODE type=cpp]int print_a( int a );
{
printf("a = %d\r\n", a);

return 0;
}

int print_b( int b );
{
printf("b = %d\r\n", b);

return 0;
}

int (*test)(int a);

int main(void)
{
test = &print_a; // 포인터형 test함수에 print_a함수의 주소를 넣었다.

test(1); // 포인터형 test함수를 호출했다.
// test 함수는 print_a의 함수 주소를 가지고 있으므로
// print_a함수를 수행한다.

test = &print_b;

test(2);

return 0;
}[/CODE]

출력결과는
a = 1
b = 2


어디에서 응용이 가능한가...?

클래스를 만들때 어떤 동작은 다른 개발자에게 넘겨주고 싶을 때가 있다.
이런 경우는 파생클래스를 만들어서 오버라이딩을 할 수도 있지만
함수 하나만 다른 개발자가 원하는 코드로 사용하게 하고 싶을 경우가 있다.


설명하기 힘드므로 아래와 같은 예를 보자

[CODE type=cpp]void 휴식( int 돈 )[/CODE]


이런 함수가 있다.

휴식은 클래스를 만들때 정하지 않고 다른 프로그래머가 내 클래스 코드를 사용할때
따로 지정하여 사용하게 하고 싶다면 아래와 같이 선언을 한다.

[CODE type=cpp]class 일상{
public:
void (*휴식)(int 돈);
};[/CODE]


이렇게 클래스를 선언해두면 다른 개발자가 '일상'이라는 클래스를 사용할때 굳이 파생클래스를 이용하지
않더라도 사용할 수가 있다.

[CODE type=cpp]void 내휴식(int 돈)
{
자동차구매( 돈 );
}

void main(void)
{
일상 = 폭주기관차;

폭주기관차.휴식 = &내휴식;

폭주기관차.휴식(200);
}[/CODE]



Powered by Tattertools