본문 바로가기

delegate

delegate / event System.Windows.Forms.Form의 Paint 핸들러는, public delegate void PaintEventHandler(object objSender, PaintEventArgs pea); 의 형식으로 정의되어 있는 delegate이다. 사실, Form을 상속받는 Form을 하나 생성했을 때, 여기에 어떠한 paintEventHandler를 설치하지 않아도 기본적으로 배경은 그려진다. 이것은, 이미 설치되어 있는 PaintEventHandler가 존재한다는 말인데, 그것은 어디에 있을까? 그것은 System.Windows.Forms.Control에 이미 설치되어 있다. 즉, 다음과 같은 빈 깡통 Form을 하나 생성해보자. 이 Form이 화면에 그려질 때, 어떤 일이 발생할까? cla.. 더보기
C#의 delegate C#에서의 delegate는 C/C++의 함수 포인터와 쓰임새와 비슷하지만, 구조적인 면에서는 STL의 Functor와 닮은 꼴이며, 패턴으로 설명하면 Observer 패턴과 유사하다고 할 수 있다. 그런데, 재미있는 것은 delegate를 사용하려면, 반드시 최소한 하나 이상의 delegate로 선언된 것과 같은 메서드를 등록해주어야 한다는 것이다. 다음과 같은 코드를 보자. class DelegateTest { public delegate void ShowMessageHandler(); public void GeneralMessage() { System.Console.WriteLine("General Message"); } public void LogMessage() { System.Console.W.. 더보기
C# delegate C/C++은 실행 시점에서 동작을 결정하기 위해서 함수 포인터를 사용한다. C++은 실행 시점에서의 동작을 정하기 위해 가상 함수와 같은 매커니즘을 사용하지만, 근본적으로는 함수 포인터를 사용한다. 그렇다면, C#에서는 어떤가? C#은 포인터라는 개념을 직접적으로 지원하지 않기 때문에 함수에 대한 주소를 얻어낸다는 것은 불가능하다. 따라서, 언뜻 생각하기에 Win32 API에서의 콜백 함수 호출은 문제가 있어보인다. 윈도우 메세지는 LRESULT 리턴 형식과 WPARAM, LPARAM이라는 두개의 32비트 파라미터를 가지며, 이 파라미터의 내용은 부호없는 정수 형식인 윈도우 메세지 내용에 따라 달라지기 때문이다. 다형성은, 함수의 시그내처를 보고 결정되기 때문에, 윈도우 메세지를 해석해서 동작을 결정해야.. 더보기