오늘은 함수 포인터에 대해 알아보겠습니다.
포인터는 뭘까요? 주소를 저장하는 메모리 공간의 이름입니다.
함수 포인터는 말그대로 함수의 주소를 저장하는 포인터입니다.
간단하게 예제를 통해 포인터 개념을 되새기고 넘어가도록 하겠습니다.
포인터 pn이 정수형변수 n을 가리키고 있는 것입니다.
그렇다면 본격적으로 함수 포인터 선언과 사용을 해보겠습니다.
함수 포인터는 함수 시그너처(함수의 반환 타입과 매개변수 리스트)와 같게 선언.
예를 들어 int func(int a,int b)인 함수의 함수 포인터는 int(*pf)(int ,int )와 같이 선언합니다.
예제를 통해 확인해 보도록 하겠습니다.
이 예제의 경우 어떤것이 출력 될까요?
바로 Print()함수의 주소입니다.
Print()함수의 시그너처가 void Print(int n)이므로 함수 포인터는 void (*pf)(int)로 선언합니다.
함수 포인터의 선언과 사용에 대해 알아 봤는데요. 지금부터 함수 포인터의 종류에 대하 알아보도록 하겠습니다.
들어가기 앞서 C++에는 세 가지의 함수 호출 방법이 있습니다.
1. 정적 함수 호출(정적 함수)
2. 객체로 멤버 함수 호출(멤버 함수)
3. 객체의 주소로 멤버 함수 호출(멤버 함수)
위 세 가지 방벙을 예제로 이해해 보겠습니다
Point객체 pt를 만들고 포인터p가 pt를 가리키고있내요.
다음으로 클라이언트 코드와 서버 코드에 대해 알아 보도록 하겠습니다.
서버 코드란 어떤 기능이나 서비스를 제공하는 코드측을 말합니다.
클라이언트 코드란 그기능을 제공받는 코드측을 말합니다.
일반적으로 서버는 하나지만 서버코드를 사용하는 클라이언트는 여러 개입니다.
예제를 통해 이해해 보도록 하겠습니다.
이해가시나요? main함수가 PrintHello()라는 기능을 제공받고 있으므로 클라이언트가됩니다.
반면 PrintHello()함수는 출력 기능을 제공하므로 서버가됩니다.
일반적으로 클라이언트 코드 측에서 서버를 호출하고 기능을 사용하지만, 때때로 서버가 클라이언트를 호출해야 하는 경우도 있습니다.
이처럼 클라이언트가 서버를 호출하면 콜(call)이라 하고 서버가 클라이언트를 호출하면 콜백(callback)이라 합니다.
STL의 많은 알고리즘도 콜백을 이용해 클라이언트 정책을 반영하고, 윈도의 모든 프로시저는 시스템이 호출하는 콜백입니다.
함수 포인터를 이용한 콜백 매커니즘을 구현 해보도록 하겠습니다.
클라이언트는 서버함수 For_each()를 세 번 호출합니다. 하지만, 세 번의 출력 결과는 클라이언트에 의해 결정됩니다. 출력 정책은 클라이언트만 알고 있습니다.
@
이처럼 콜백 메커니즘을 이용하면 알고리즘 적챙을 클라이언트에서 유연하게 바꿀 수 있게 서버를 더욱 추상화할 수 있습니다.
이제 함수 포인터에 대한 개념이 어느 정도 이해되셨나요? ㅎㅎ
저도 초보라 설명이 미숙한점 이해해 주시기 바랍니다.
다음 시간에는 함수 객체에 대하여 알아보도록 하겠습니다.
<작성자 - CODER_CJH>
<참고자료 - 뇌를 자극하는 C++STL>
'Programming Language > C++' 카테고리의 다른 글
6. 템플릿 (0) | 2016.06.01 |
---|---|
5.함수 객체 (0) | 2016.06.01 |
3. STL에 필요한 주요 연산자 오버로딩(2) (4) | 2016.06.01 |
2. 연산자오버로딩(1) (0) | 2016.06.01 |
1. STL에 들어가기 앞서... (1) | 2016.06.01 |