Programming/C#2011. 11. 9. 12:05

eventClass.PlayGames += new EventHandler(EventClass_PlayGames);


이벤트와 이벤트 핸들러를 연결하는 구문이죠?

이벤트인 PlayGames와 이벤트 핸들러 메소드인 EventClass_PlayGames를 연결한다고 했습니다.


그런데, 사실 저 EventHandler라는 키워드는 예약어가 아닙니다.

C#에서 자동으로 만들어 주는 '대리자'로써, 이벤트를 연결하는 데 쓰이는 거죠.

실제로 코드의 내부까지 침입해보면 EventHandler를 선언하는 구문이 나와 있습니다.

이걸 맘대로 바꾸면.. 글쎄요. 실험해보진 않았습니다만 일단 어떻게든 됩니다.


그럼 대리자란 뭘까요?

대리자는 다른 메소드를 대신해줍니다. 정확히 말하면 '참조'죠.

인스턴스가 클래스를 참조하는 것처럼, 대리자는 메소드를 참조합니다.


new EventHandler(EventClass_PlayGames);


그래서 EventHandler 키워드 앞에 new가 붙은 거고, 인자로 이벤트 핸들러 메소드를 받은겁니다.

이제 EvenetHandler()를 호출하면 EventClass_PlayGames()에 있는 코드가 실행되겠지요.

이를 이용해서, 클래스는 자신에게 연결된 이벤트 핸들러를 알지 못해도

대리자를 대신 호출하는 방법으로 이벤트 핸들러들을 호출하는 겁니다.

대리자를 호출하는 방법..은 우리에게 보이지 않지만요. 뭐, 알아서 잘 해줍니다!


대리자는 다음과 같이 사용합니다.


==============================================================


public delegate void DaeReeJa();


private void IMFreeMan() {

  MessageBox.Show("나는 자유인이다!!!");

}


private void IMNegativeMan() {

  MessageBox.Show("그래서 뭐 어쩌라고;");

}


DaeReeJa daeReeJa += new DaeReeJa(IMFreeMan);

daeReeJa += new DaeReeJa(IMNegativeMan);


daeReeJa();


==============================================================


delegate라는 키워드를 중간에 끼워넣어서 대리자를 선언합니다.

이 때, 반환유형이라던가 인수라던가 하는 게 대리자와 일치하지 않는 메소드의 경우에는

대리자가 참조할 수 없으니 주의하세요.

string을 가져오고 싶은데 int를 반환하는 경우가 있어선 안 되겠죠?

같은 이유로, EventHandler 대리자도 반환유형을 void, 인수를 EventArgs와 object.

이렇게 두개만 받을 수 있는 이유가 설명됩니다.


대리자와 메소드를 연결할 때, += 연산자를 씁니다. 이건 이벤트때도 봤었죠?

괜히 +를 붙이는 게 아니에요. 여러개를 동시에 참조할 수 있기 때문에 +가 있는 겁니다.

대리자에 연결된 순서대로 코드가 실행되죠. 같은 코드도 중복해서 연결이 가능합니다!


이제 대리자를 호출하면 대리자에 연결된 메소드가 모두 실행됩니다.

참 쉽죠?


..안 쉬울지도..



넵. 다음은 콜백 함수입니다.

콜백 함수.. 뭔가 이름이 어렵군요. 심오하도다. 심오하도다!

콜백 함수는 아까 배운 대리자를 이용한 디자인 패턴, 즉 알고리즘 중 하나입니다.

다른 클래스의 메소드를 대리자로 받아서, 그걸 가지고 코드 짜는데 이용하거나 역호출하는 방법이죠.

그러니까 콜(Call : 요청하다) 백(Back : 되돌리다)입니다.

콜백 함수라는 기능이 따로 있는 건 아닌거죠. 단지 이러한 코딩 방식에 이름을 붙였을 뿐.


디자인 패턴은 기본적인 기능을 습득한 후에 많이 배우게 될 겁니다.

일단, 지금은 맛보기.

그러니까 예제 보시죠!(맥락 없지만)


===============================================================


public delegate void Dele();


public class CallBackClass {

  public void CallBackMethod(Dele dele) {

    dele();

  }

}


public class Form1 : Form {

  CallBackClass callBackClass;

  public void DeleMethod() {

    MessageBox.Show("8월 4일 데몬슬레이어 나오면 키워봄ㅎㅎ");

  }

  public Form1() {

    callBackClass = new CallBackClass();

    callBackClass.CallBackMethod(DeleMethod);

  }

}


============================================================


Form1에서 CallBackClass의 인스턴스를 생성하고, DeleMethod를 인자로 넘겨줍니다.

그리고선 CallBackClass의 CallBackMethod에서 대리자로 받아서 호출을 하고 있습니다.

여기서 주목할 점은, 메소드를 인자로 넘겨줘서 대리자에 연결할 수 있다는 점입니다!

메소드를 변수처럼 사용하는 거죠.


callBackClass.CallBackMethod(new Dele(DeleMethod));


메소드의 이름을 주지 않고도, 대리자를 새로 생성해서 주는 방법이 있습니다만,

아무래도 그냥 이름만 주는 게 더 편리하겠죠? 'ㅂ'

솔직히, 방금 이 기능 알고서 코딩하기 편하겠다며 기뻐했음(..)


여튼, 이렇습니다. 콜백 함수의 정리는 이것으로 끝낼게요.
 

출처 : http://blog.naver.com/dpdlrnsdla?Redirect=Log&logNo=140135517216
Posted by Mocker