멀티캐스트 델리게이트(Multicast Delegate)는 하나의 델리게이트가 두 개 이상의 메서드에 대한 참조를 동시에 보유할 수 있는 델리게이트를 의미합니다. C#에서는 += 연산자를 사용해 메서드를 델리게이트에 추가(구독)하고, -= 연산자를 사용해 제거(구독 해지)할 수 있습니다.
델리게이트가 호출되면 내부에 등록된 모든 메서드가 등록된 순서대로 차례로 실행됩니다. 이러한 특성 덕분에 하나의 호출 지점에서 여러 메서드를 일괄 실행해야 하는 이벤트 처리 시나리오에서 멀티캐스트 델리게이트가 널리 활용됩니다.
멀티캐스트 델리게이트 예제
다음은 두 개의 메서드(CalAdd(), CalSub())를 하나의 델리게이트에 연결하여 사용하는 예제입니다.
using System;
delegate void myDelegate(int val1, int val2);
public class Demo {
public static void CalAdd(int val1, int val2) {
Console.WriteLine("{0} + {1} = {2}", val1, val2, val1 + val2);
}
public static void CalSub(int val1, int val2) {
Console.WriteLine("{0} - {1} = {2}", val1, val2, val1 - val2);
}
}
public class Program {
static void Main() {
myDelegate d = new myDelegate(Demo.CalAdd);
d += new myDelegate(Demo.CalSub); // CalSub 메서드 추가
d(45, 70);
d -= new myDelegate(Demo.CalAdd); // CalAdd 메서드 제거
d(95, 70);
d += new myDelegate(Demo.CalSub); // CalSub 메서드 다시 추가
d(88, 6);
d -= new myDelegate(Demo.CalAdd); // CalAdd 메서드 제거
d(40, 20);
Console.Read();
}
}
예제 코드 설명
위 예제에서 선언된 델리게이트는 다음과 같습니다.
delegate void myDelegate(int val1, int val2);
이 델리게이트는 int형 매개변수 두 개를 받고 반환값이 없는(void) 메서드만 참조할 수 있습니다. 그리고 아래 코드처럼 +=와 -= 연산자를 통해 여러 메서드를 동적으로 추가하거나 제거하며 참조 목록을 관리합니다.
myDelegate d = new myDelegate(Demo.CalAdd); d += new myDelegate(Demo.CalSub); d(45, 70); d -= new myDelegate(Demo.CalAdd); d(95, 70); d += new myDelegate(Demo.CalSub); d(88, 6); d -= new myDelegate(Demo.CalAdd); d(40, 20);
실행 결과 분석
- d(45, 70): CalAdd와 CalSub가 모두 등록되어 있으므로 덧셈 결과와 뺄셈 결과가 순서대로 출력됩니다.
- d(95, 70): CalAdd가 제거되었으므로 CalSub(뺄셈)만 실행됩니다.
- d(88, 6): CalSub가 중복으로 추가되어 뺄셈 결과가 두 번 출력됩니다. 즉, 같은 메서드도 여러 번 등록하면 그 횟수만큼 호출됩니다.
- d(40, 20): 등록되어 있지 않은 CalAdd를 제거하는 연산이지만 오류 없이 무시되고, 남아 있는 CalSub 두 개가 실행됩니다.
정리
멀티캐스트 델리게이트는 System.MulticastDelegate 클래스를 기반으로 하며, 여러 메서드를 하나의 호출 목록(Invocation List)으로 묶어 관리할 수 있는 강력한 기능입니다. 단, 모든 메서드는 델리게이트의 시그니처(매개변수와 반환 타입)와 일치해야 하며, 반환값이 있는 경우 마지막에 호출된 메서드의 반환값만 돌려받는다는 점을 유의해야 합니다.