C++에 함수 콜백이 있다면 C#에는 이벤트가 있죠.
이벤트라는 것은 특정 행위가 일어났을 때 이것을 외부로 알리기 위한 도구입니다.
설마 이 글을 읽으면서 아직도 이벤트 연결을 못 하는 사람이 있을 거라는 생각은 하지 않지만....그래도 모르니 ㅎㅎㅎ
//이벤트 연결 this.insSkype.OpenCompleteEvent += new claSkype.OpenCompleteEventHandler(insSkype_OpenCompleteEvent); ... ... void insSkype_OpenCompleteEvent(object sender, claSkype.OpenCompleteEventArgs e) { MessageBox.Show(e.Temp.ToString()); }
+=을 하는 순간 자동생성할 건지 물어봅니다.
여기서 탭키를 누르면 이벤트가 자동으로 생성됩니다.
일반적으로 사용되는 이벤트들(클릭이나 온로드 같은...)의 형태로 선언하는 방법입니다.
#region 오픈 이벤트가 완료되면 발생 합니다. 발생하는 이벤트 /// <summary> /// 이벤트 발생시 전달할 모델 /// </summary> public class OpenCompleteEventArgs : EventArgs { public int Temp = 0; public OpenCompleteEventArgs(int Temp) { this.Temp = Temp; } } public delegate void OpenCompleteEventHandler(object sender, OpenCompleteEventArgs e); /// <summary> /// 오픈 이벤트가 오면 발생합니다. /// </summary> public event OpenCompleteEventHandler OpenCompleteEvent; protected void OnOpenComplete(OpenCompleteEventArgs e) { if (OpenCompleteEvent != null) { OpenCompleteEvent(this, e); } } /// <summary> /// 오픈 완료 이벤트 /// </summary> private void OpenComplete(int Temp) { OpenCompleteEventArgs e = new OpenCompleteEventArgs(Temp); OnOpenComplete(e); } #endregion
6번 줄 : 이벤트 발생 시 전달용으로 사용할 모델
15번 줄 : 이벤트에 사용할 대리자(델리게이트, delegate)를 생성합니다.
- 이때 매개변수로 전달하는 'OpenCompleteEventArgs'는 전달하고자 하는 모델입니다.
- 원하는 매개변수로 설정합니다.
20번 줄 : 생성한 대리자를 이용하여 이벤트를 선언합니다.
22번 줄 : 이 이벤트를 발생시킬 때 사용할 메서드
- 외부에서 연결된 이벤트가 없는 경우 에러가 나므로 'null'일 때는 이벤트가 발생하지 않도록 합니다.
33번 줄 : 이벤트를 발생시키는 테스트 코드
'OpenCompleteEventArgs'는 'EventArgs'를 상속받아 일반적인 이벤트 형태이기 때문에 매개변수를 지정할 수 있습니다.
해당 매개를 지정하여 필요한 정보를 넘기고 쓰는 쪽에서는 'e.' 값으로 사용할 수 있습니다.
'OpenComplete'은 이벤트 발생을 공통화시키기 위해 사용하는 함수로 일반 코드에서 동일하게 코딩하면 동일하게 동작합니다.
위코드는 복잡합니다.
이벤트를 발생시킨 클래스의 정보가 필요 없다면 더더욱 복잡하죠 ㅎㅎㅎ
이럴 때 사용하는 것이 간소화 방법입니다.
public delegate void ReloadPageDelegate(int Temp); public event ReloadPageDelegate OnReloadPage; private void ReloadPage(int Temp) { if(null != OnReloadPage) { OnReloadPage(Temp); } }
전달용 모델은 따로 선언하지 않고,
사용할 대리자를 선언할 때 매개변수만 지정합니다.
'ReloadPage'를 호출하면 동일하게 동작하는 것을 확인할 수 있습니다.
간단하게 이벤트를 구현하면서도 표준이벤트를 이용하여 구성하는 방법입니다.
/// <SUMMARY> /// 클릭 이벤트 /// </SUMMARY> public event EventHandler OnClick; public void ButtonClick(object sender, EventArgs args) { if (OnClick != null) { OnClick(this, args); } }
'EventHandler'는 표준 이벤트 대리자입니다.
이것을 이용하면 별도의 대리자를 선언하지 않아도 됩니다.
'ButtonClick'를 호출하면 원하는 동작을 합니다.
그때그때 상황에 맞는 걸 쓰시면 되겠습니다.
저는 거의 '2. 간소화된 방법'을 사용합니다.
커스텀 데이터를 전달해야 하는 일이 많으니까요 ㅎㅎㅎ