12.5 Muti Delegate의 구현
하나의 Delegate에 여러 개의 Delegate를 등록하는 방법에 대해서 알아보겠습니다. 하나의 Delegate가 여러 개의 Delegate를 포함할 수 있습니다. 이럴 때 쓰이는 것이 += 연산자입니다. 또한 여러 개가 묶인 Delegate에서 특정 Delegate를 제거하는 것이 -= 연산자입니다.
하나의 Delegate가 아니고 여러 개의 Delegate가 묶여있다면 모든 Delegate들이 전부 호출됩니다. 다음은 여러 개의 Delegate를 묶거나 특정 Delegate를 제거하고 실행하는 것을 보여주는 예제입니다.
& |
MultiDelegateTest.cs |
Ü 하나의 Delegate로 여러 개의 메서드를 호출하는 예제 |
using System; //하나의 Delegate제거 후 하나의 Deleate 호출 | ||
C:\C#Example\12>csc MultiDelegateTest.cs C:\C#Example\12>MultiDelegateTest Normal Method입니다!! add TopDelegator 1 Normal Method입니다!! add TopDelegator 2 Static Method입니다!! add TopDelegator 2 Static Method입니다!! remove TopDelegator 1 |
가장 중요한 요소는 += 연산자입니다. 흔히 숫자 값이나 string을 더할 때 많이 사용하는 연산자입니다. 여기에서 Delegate를 위해서 연산자 오버로딩된 것으로, 생성된 Delegate 객체간에 += 연산자를 사용하여 여러 개의 Delegate를 하나로 병합할 수 있습니다.
bank = td1;
bank("add TopDelegator 1"); //td1의 Delegate호출
bank += td2;
bank("add TopDelegator 2"); //td1,td2의 Delegate호출(두개가 동시에 호출)
결과 창을 보시면 2개의 Delegate가 포함된 Delegate를 호출했을 때 2개 모두 호출되는 것을 확인하실 수 있습니다. 이런 방법으로 deleTest("add deleTest2");를 호출해 주면 지정되어 있는 메서드가 모두 호출됩니다.
메서드를 추가하는 방법이 있으니 제거하는 방법도 있겠지요. 추가했던 메서드를 제거할 때에는 -= 연산자를 사용하여 추가했던 Delegate 객체를 제거하면 됩니다.
bank -= td1;
bank("remove TopDelegator 1");
▣ 하나의 Delegate에 다른 Delegate를 추가, 삭제하는 방법 |
ㅁ 추가하려는 메서드를 담고 있는 객체를 += 연산자를 사용하여 등록 ㅁ 추가한 메서드를 제거할 때에는 –= 연산자를 사용하여 제거 ㅁ 멀티 Delegate를 사용할 때 메서드는 반드시 void를 반환해야 함 |
멀티 Delegate를 사용할 때 메서드는 반드시 void를 반환해야 하며 void를 반환하지 않으면 +=과 같은 연산자를 사용할 수 없습니다. 만약, 2개의 Delegate가 각각 다른 값을 리턴하고 있다면 어떠한 값을 우선적으로 리턴해야 하는지 애매하기 때문입니다. 즉, 호출을 목적으로 하는 것이지 리턴을 목적으로 하지 않기 때문입니다.