ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C#] Delegate에 대한 공부(3) Delegate Chain
    C# 2022. 4. 1. 13:12
    728x90

    안녕하세요.

    벌써 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

     

    댓글

Designed by Tistory.