반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

욱꾸미의 주꾸미 발

[C#] Delegate에 대한 공부(3) Delegate Chain 본문

C#

[C#] Delegate에 대한 공부(3) Delegate Chain

욱꾸미 2022. 4. 1. 13:12
반응형

안녕하세요.

벌써 Deleagate 세 번째 글이네요.

 

많은 개발자 분들이 C#을 사용하지는 않지만 C#이라는 언어는 참 신기~한것 같네요.

 

오늘은 Deleagate Chain에 대해 알아보고자 합니다.

이번글 역시 뇌를 자극하는 C# 5.0프로그래밍 책을 통해 공부한 내용입니다 :D

Deleagate Chain은 delegate하나가 여러개의 메소드를 동시에 참조하는걸 말합니다.

 

방법은 기존 선언방식에서 다른 메소드를 += 연산자를 통해 연결해 줍니다.

 

기존에는 하나의 메소드에 대해서만 참조를 하고 넘겨줬지만 이제는 여러개의 메소드를 참조해보겠습니다.

 

예시로 만나보시죠~

 

delegate void ThereIsFire(string location);

먼저 사용할 delegate를 선언하겠습니다.

 

        private static void Call119(string location)
        {
            Console.WriteLine("주소는 {0}입니다\n", location);
        }

        private static void ShoutOut(string location)
        {
            Console.WriteLine("불이야 불! {0}에 불났어요!\n",location);
        }

        private static void Escape(string location)
        {
            Console.WriteLine("{0}에 불이 났으니 도망치세요~\n", location);
        }

동시에 참조할 메소드 들입니다.

위 세개의 메소드를 하나의 delegate에 연결해 보겠습니다.

 

다음은 메인입니다. 여기서 위에서 언급한 세개의 메소드들을 연결해 주겠습니다.

            ThereIsFire fire = new ThereIsFire(ShoutOut);
            fire += new ThereIsFire(Call119);
            fire += new ThereIsFire(Escape);

            fire("회사");

 

흔히 WPF 이벤트 연결하듯 +=로 계속 메소드를 추가해주면 됩니다.

이부분이 오늘의 핵심이겠네요.

 

실행 결과입니다.

이렇게 fire("회사")를 통해 세개의 메소드가 연달아 호출되는걸 확인 할 수 있네요.

또다른 Delegate 메소드 체인방법으로는 Delegate.Combine을 하는 방법입니다.

            ThereIsFire fire = (ThereIsFire)Delegate.Combine(
                new ThereIsFire(ShoutOut),
                new ThereIsFire(Call119),
                new ThereIsFire(Escape)
                );

이렇게 Delegate.Combine을 통해 연결할 메소드들을 추가해주면 되겠습니다.

 

추가만 될까요? 아니죠~ 이제는 제거하는 방법에 대해 알아보겠습니다.

방법은 역시 간단합니다. 추가에 +=를 통해 추가했다면? 제거는 -=를 이용합니다.

            ThereIsFire fire = new ThereIsFire(ShoutOut);
            fire += new ThereIsFire(Call119);
            fire += new ThereIsFire(Escape);

            fire -= Call119;

이렇게 Call119라는 메소드를 제거한 후 실행해보겠습니다.

결과입니다. 제거가 돼서 없이 나오는걸 확인 하실 수 있습니다.

또 다른 방법으로는 Delegate.Remove라는 메소드를 이용하면 됩니다.

방식은 Delegate.Remove(제거할 Delegate 모음, 제거할 Delegate Method)로 확인됩니다.

예시는

            ThereIsFire fire = new ThereIsFire(ShoutOut);
            fire += new ThereIsFire(Call119);
            fire += new ThereIsFire(Escape);

            fire = (ThereIsFire)Delegate.Remove(fire, new ThereIsFire(Call119));

이렇게 사용해 주시면 되겠씁니다~

 

이상으로 Delegate Chain에 대해 간단하게 공부했습니다.

 

항상 코로나 조심하시고 건강하시길 바랍니다.

감사합니다. :D

 

반응형