C++의 함수포인터를 생각하면 쉽다. 코드영역에 저장되어있는 함수를 참조하기 위해 사용하는 문법이다. 다만, delegate는 함수포인터의 시그니처(반환형과 매개변수 타입)를 정의하는 클래스라고 생각하면 된다.
delegate int MyDelegate(int a, string b); //int를 리턴하고, 매개변수로 int와 string을 받는 함수 정의
internal class Program
{
static void Main(string[] args)
{
MyDelegate DelegateInst = (int a, string b) =>
{
return 10;
}; // 람다 등 시그니처가 일치하는 함수를 담을 수 있음.
}
}
MSDN - delegate
MSDN에서는 델리게이트를 다음과 같이 설명한다
대리자는 C++ 함수 포인터와 유사하지만 C++ 함수 포인터와 달리 멤버 함수에 대해 완전히 개체 지향입니다. 대리자는 개체 인스턴스 및 메서드를 모두 캡슐화합니다.
이 말을 C++로 따지면 함수포인터 보단 std::function과 가깝다고 할 수 있다.
MSDN - MulticastDelegate
멀티캐스트 델리게이트는 하나의 델리게이트 인스턴스 안에 여러 함수를 저장해놓고 사용하는 것을 의미한다. 간단하게 LinkedList<MyDelegate> Funcs라고 생각하면 쉽다.
추상화가 잘되어있어 함수를 여러개 호출할수 있다는 인터페이스를 바깥에 보여주진 않는다. +=연산자를 통해 함수를 추가하는것이 가능하다. 함수를 여러개 저장해놓고 Funcs()를 통해 호출하면 인스턴스에 저장된 함수들이 순차적으로 실행된다.
delegate void TestDelegate();
namespace Delegate
{
internal class Program
{
static void Main(string[] args)
{
TestDelegate MuliCast = new TestDelegate(() =>
{
Console.WriteLine("Test0");
});
MuliCast += () =>
{
Console.WriteLine("Test1");
};
MuliCast += () =>
{
Console.WriteLine("Test2");
};
MuliCast += () =>
{
Console.WriteLine("Test3");
};
MuliCast();
//출력
//Test0
//Test1
//Test2
//Test3
}
}
}
multicast delegate을 알고있었다면, 이번에 프로젝트를 진행하면서 관찰자패턴을 사용했던 몬스터의 DeathBroadCast나, 마우스의 ReleaseClickEvents를 이 방법으로 관리하지 않았을까 생각이 든다. 관찰자 패턴이나 발행 구독 패턴을 구현하기 좋은 기능이라고 생각한다.