Callback 함수 및 Delegate 란
C++이나, C를 공하를 한사람은 Callback을 정말 어렵게 사용을 하였을 것입니다. 하지만 C#에서는 정말 간단히 Callback을 사용 즉
Delegate를 사용을 할수가 있습니다.
이번에 설명 드릴 내용들
- Callback 이란 무엇인가?
- Delegate는 무엇인가?
CallBack 이란
사전적 의미 : Call ( 호출하다 ) Back ( 되돌려주다 ) 가 됩니다. 호출한 여석에게 다시 되돌려 주는것이 Callback
하지만, C#에서는 Delegate로 사용을 하고 있습니다.
C++ 예제
using namespace System; using namespace System::Runtime::InteropServices; // A delegate type. delegate bool CallBack(int hwnd, int lParam); // Managed type with the method to call. ref class EnumReport { // Report the window handle. public: [DllImport("user32")] static int EnumWindows(CallBack^ x, int y); static void Main() { EnumReport^ er = gcnew EnumReport; CallBack^ myCallBack = gcnew CallBack(&EnumReport::Report); EnumWindows(myCallBack, 0); } static bool Report(int hwnd, int lParam) { Console::Write(L"Window handle is "); Console::WriteLine(hwnd); return true; } }; int main() { EnumReport::Main();
}
본예제는 응용프로그램 내의 코드에서 외부 DLL함수를 처리될수 있도록 하여줍니다.
콜백함수를 응용프로그램에서 Dll로 간접적으로 전달되어 다시 응용프로그램으로 전달이 되는 예제 입니다
C# 예제
using System; using System.Runtime.InteropServices; public delegate bool CallBack(int hwnd, int lParam); public class EnumReportApp { [DllImport("user32")] public static extern int EnumWindows(CallBack x, int y); public static void Main() { CallBack myCallBack = new CallBack(EnumReportApp.Report); EnumWindows(myCallBack, 0); } public static bool Report(int hwnd, int lParam) { Console.Write("Window handle is "); Console.WriteLine(hwnd); return true; }
}
즉 본예제는 Delete를 사용하는것과 동일하게 사용을 합니다. 문법적으로는 C++과 C#에서 확연한 차리를 보이지만 개념적으로는
모두 동일하게 적용이 되어 있습니다
대리자 ( DELEGATE )
대리자는 C및 C++ 함수 포인터처럼 메서드를 안전하게 캡슐화하는 형식입니다. 이말은 즉 누군가에게 대신 일을 시킨다는 말이 됩니다.
어느 누구나 다들 꿈을 꾸고 있지만, 나 대신 누군가에게 일을 시키고 싶은 생각 다들 한번씩 하겠지만, 이것을 즉 프로그램에서는 가능하죠
대리자,..... 대신 일을 해주는 사람 ( 한국어로 번역을 하면 )
public delegate void Del(string message);
Delegate를 선언 하는 부분입니다. 반환값은 Void 구요 , string을 인수로 사용을 하고 있습니다.
대리자 개체는 아래와 같이 래핑할 메서드의 이름을 제공하거나 무명 메서드를 사용을 합니다. 아래내용은 즉 대리가자 할일을
정리해놓은 것입니다.
대리자를 인스턴스하고 나면 대리자에 의한 함수 호출이 이루어 지게 되는 것입니다. 이과정을 대리자 호출이라고 하는데
인스턴스화된 대리가 자체 함수처럼 불러서 사용을 할수가 있는 것이지요
}
handler("Hello World");
Delegate는 개체이므로 매개 변수로 전달할수가 없고, 속성에 사용을 할수가 없는것이 특징입니다.
현재 대리자를 사용하는 코드에서 함수를 구현하지 않아도 됩니다. 비동기 콜백이라는것을 사용을 하는데 응요하여 사용을많이 합니다.
오랜 시작 작업을 해야될경우 "완료 확인"등을 응답을 받을수가 있습니다.
namespace @delegate
{
class Program
{
public delegate void Del(string message);
static void Main(string[] args)
{
Del handler = DelegateMethod;
// Call the delegate.
handler("Hello World");
}
// Create a method for a delegate.
public static void DelegateMethod(string message)
{
System.Console.WriteLine(message);
}
}
}
어렵지는 않지만, 사용을 하면 중독성이 강한 그리고 언젠가는 사용을 해야되는 기본 개념을 정리 해보았습니다.
개인적으로 현업에 개발자로 근무를 하면서 참 신통방통한 녀석이네 생각이 많이 들었던 부분입니다.
'PROGRAMING > C#' 카테고리의 다른 글
값 타입 (0) | 2018.01.03 |
---|---|
삭제 패턴 (0) | 2018.01.03 |
인터페이스 (Interface) (0) | 2017.12.27 |
param 매개 변수 (0) | 2017.12.27 |
C# 키워드 (0) | 2017.12.27 |