1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
#include <iostream>
using namespace std;
 
/**
*    클라이언트 코드와 서버코드
*    서비스를 제공하는 코드측을 서버코드
*    그기능을 제공받는 코드측을 클라이언트코드
*/
 
//서버//
void PrintCall(){        
    cout<<"HelloWorld"<<endl;
}
 
//클라이언트//
int main(){
 
    PrintCall();
 
    /**
    *    이처럼 클라이언트가 서버를
    *    호출하게되면 Call
    *    반대로 서버가 클라이언트를 호출하게되면
    *    콜백(CallBack)
    */
 
    // 윈도우의 모든 프로시저는 시스템이 호출하는 Callback함수
 
    system("Pause");
    return 0;
}

 

 

서버에서 클라이언트 코드 호출 ( 콜백함수 )

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
#include <iostream>
using namespace std;
 
//서버 코드영역//
void PrintCall(){
    cout<<"HelloWorld"<<endl;
    Client();
}
 
//클라이언트 코드영역//
void Client(){
    cout<<"난 클라이언트"<<endl;
}
int main(){
 
    PrintCall();
    // 서버에서 클라이언트측 코드인 Client() 함수를 호출하면
    // 이때 Client()함수를 '콜백함수'라 합니다.
 
    // 서버는 여러클라이언트에의해 호출되며 클라이언트의 존재를 알수없는데
    // 위의 예제처럼 서버에서 클라이언트 코드를 알고 호출하는것을 불가능
    // 합니다. 그래서 서버에게 알려줄필요가 있는데
    // 그방법으론 함수포인터매개변수를 이용한 콜백함수의 주소를전달하는방법
    // 객체,대리자,전략패터등을 사용
 
    // 말그대로 서버는 구체적인 작업이 없이 클라이언트 함수의 의해서 작업
    // 내용이 결정납니다.
 
    // 윈도우의 모든 프로시저는 시스템이 호출하는 Callback함수
 
    system("Pause");
    return 0;
}

 

 

// 함수포인터매개변수를 이용한 콜백함수의 주소를전달하는방법

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <algorithm>
 
using namespace std;
 
//서버 코드영역//
void For_each(int *begin, int *end, void (*pf)(int) ){
    while(begin != end){
        pf(*begin++); // 클라이언트 함수 호출 콜백
    }
}
 
//클라이언트 코드영역//
void Print1(int n){
    cout<< n << endl;
}
void Print2(int n){
    cout<< n*n <<endl;
}
int main(){
 
    int arr[5] = {10, 20, 30, 40, 50};
    For_each(arr, arr+5, Print1);
    cout<<endl;
    for_each(arr, arr+5, Print2);    
 
    /**
    * 서버코드는 단지 클라이언트함수를 처음부터끝까지
    * 호출해주기만 한다. 추상화
    * 출력정책은 클라이언트에서만 알고있고, 수정한다.
    */
 
    system("Pause");
    return 0;
}

 

+ Recent posts