ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [11강] 델리게이트와 이벤트
    프로그래밍/C# 2022. 6. 20. 03:24

    목차

    델리게이트의 의미
    델리게이트의 형식과 사용
    멀티캐스트 델리게이트
    이벤트의 의미
    이벤트의 형식과 사용
    델리게이트와 이벤트의 비교

     

    델리게이트Delegate의 의미

    Delegate 

      위임하다(권한, 임무들). 대리자

      델리게이트의 본질은 메서드 참조형이다.

     

    델리게이트의 역할

      복수 또는 단일 메서드를 대신하여 호출하는 역할 : 같은 형식(매개변수, return형이 같은 것)이어야 한다

      메서드만 호출 가능

      외부에서 호출 가능(private, protected 메서드는 호출 불가)

     

    델리게이트의 형식과 사용

    델리게이트 선언

      [접근한정자] delegate return형 델리게이트명(메서드 매개변수);

      delegate int DelegateName(string name);

     

    델리게이트 사용

      - 델리게이트 생성(C# 1.0 이상에서 사용)

        델리게이트형 델리게이트명 = new 델리게이트명(호출할 메서드명)

        DelegateType DelegateMethod = new DelegateType(Function);

     

      - 델리게이트 선언으로 사용(C# 2.0 이상에서 사용)

        델리게이트형 델리게이트명 = 호출할 메서드명;

        DelegateType DelegateMethod = Function;

     

    예시 코드

    delegate void DelegateType(string str);
    
    class A
    {
        public void Print(string str)
        {
            Console.WriteLine(str);
        }
    }
    
    public class Practice
    {
        static void Main(string[] args)
        {
            A test = new A();
            DelegateType DelMethod1 = new DelegateType(test.Print); // C# 1.0 이상에서 사용가능
            DelMethod1("예시 문구1입니다.");
    
            DelegateType DelMethod2 = test.Print; // C# 2.0 이상에서 사용가능
            DelMethod2("예시 문구2입니다.");
        }
    }

     

    멀티캐스트 델리게이트 Multicast delegate

    멀티캐스트 : 데이터를 여러 사용자에게 동시에 보내다

      하나의 델리게이트에 여러 메서드가 연동되어 있고, 이 델리게이트가 호출되면 연결된 모든 메서드들에게 동시에 전달된다.

     

    델리게이트 조합

      - 역할 : 다수 또는 단일 메서드 호출

      - +=, -+ (포함과 제거) 호출할 메서드 포함 또는 제거

     

    예시 코드

    delegate void DelegateType();
    
    class A
    {
        public void PrintA()
        {
            Console.WriteLine("This method is : Print A");
        }
    
        public void PrintB()
        {
            Console.WriteLine("This method is : Print B");
        }
    }
    
    public class Practice
    {
        static void Main(string[] args)
        {
    
            A test = new A();
            DelegateType onDelFunc = test.PrintA;
            onDelFunc += test.PrintB;
            onDelFunc();
            onDelFunc -= test.PrintA;
            onDelFunc();
        }
    }

    * 의문인 점.

    인강에서는 강사님이 onDelFunc += test.PrintA; 가 바로 추가가 되는데, 내가 해보니 이상하게 빨간 밑줄이 그어진다... IDE의 차이인가? 어쨌든 라이더는 이걸 용납하지 않았다... 인강이 5년 전에 제작되었는데 그 새 뭔가가 바뀐 걸까?

    수정 : 코드를 변경했다가 다시 돌려보니 문제 없이 실행도 된다. 이거 때문에 10분정도 끙끙댔는데 잠깐 다른 것을 하고 온 사이에 무슨 일이 일어난 것일까...

     

    이벤트의 의미

    이벤트의 의미

      - (특히 중요한) 사건

      - 특정 상황이 발생했을 때 알리고자 하는 용도(호출을 의미 + 데이터)

      - 이벤트를 발생시키는 클래스를 게시자

      - 이벤트를 받거나 처리하는 클래스를 구독자

      - 델리게이트를 기반으로 한다(메서드 호출)

      - 이벤트는 메서드 안에서만 사용 가능

     

    이벤트의 형식과 사용

    기본 형식

      [접근한정자] event 델리게이트형 이벤트명

      delegate void DelegateType(string message);

      class A

      {

          public event DelegateType EventHandler;

          public void Func(string message)

          {

              EventHandler(message);

          }

      }

     

    이벤트에 메서드 추가 및 삭제

    +=, -=

    객체.이벤트핸들러 += new 델리게이트형(객체.메서드);

    객체.이벤트핸들러 += 객체.메서드1;

    객체.이벤트핸들러 += 객체.메서드2;

    객체.이벤트핸들러 -= 객체.메서드1;

     

    예시 코드

    public class Practice
    {
        static void Main(string[] args)
        {
            C testC = new C();
            D testD = new D();
    
            testC.EventHandler += new DelegateType(testD.PrintA);
            testC.EventHandler += new DelegateType(testD.PrintB);
            testC.Func("Hello");
    
            testC.EventHandler -= testD.PrintB;
            testC.Func("World!");
            testC.EventHandler -= testD.PrintA;
    
            testC.EventHandler += testD.PrintA;
            testC.EventHandler += testD.PrintB;
            testC.Func("Hello World!");
        }
    }
    
    delegate void DelegateType(string str);
    
    class C
    {
        public event DelegateType EventHandler;
    
        public void Func(string message)
        {
            EventHandler(message);
        }
    }
    
    class D
    {
        public void PrintA(string message)
        {
            Console.WriteLine(message);
        }
    
        public void PrintB(string message)
        {
            Console.WriteLine(message);
        }
    }

     

    이벤트의 핵심

      - 이벤트 핸들러에 객체의 메서드를 연결

      - 이벤트 핸들러는 객체 메서드에서 호 출

      - 이벤트 핸들럴르 포함하는 객체 안의 메서드를 통해 다른 객체 또는 같은 객체의 메서드를 호출하기 위한 방법(같은 데이터 전달)

     

    델리게이트와 이벤트의 비교

     

    '프로그래밍 > C#' 카테고리의 다른 글

    [13강] 인터페이스  (0) 2022.08.13
    [12강] 상속  (0) 2022.08.13
    [10강] 배열/객체배열, 속성/인덱서 비교  (0) 2022.06.20
    [09강] 속성과 인덱서  (0) 2022.06.13
    [08강] 클래스  (0) 2022.05.31
Designed by Tistory.