C# - delegate & event) 복습을 위해 작성하는 글 2023-04-20

rizz·2023년 4월 20일
0

C

목록 보기
5/25

📒 갈무리 - delegate

📌 delegate란?

- 메소드의 참조를 포함하는 영역

- 메소드 참조를 위해서는 선언한 delegate와 참조할 메소드의 반환형, 매개 변수의 개수, 타입이 같아야 한다.

- 클래스간 통신에 자주 활용한다.

- 함수의 파라미터로 사용하면 결합도를 낮출 수 있어, 자주 사용한다.

📌 delegate 선언

// C#

// delegate 생성
delegate void DelegateTest(int a, int b);

// Sum 함수 구현
static void Sum(int a, int b)
{
	Console.WirteLine("a + b = " + (a + n));
}

// 기본 선언
DelegateTest delegate1 = new DelegateTest(Sum);

// 간락햔 선언
DelegateTest delegate2 = Sum;

// 익명 함수로 선언
DelegateTest delegate3 = delegate(int a, int b)
{
	Console.WirteLine("a + b = " + (a + b));
};

// 람다식 선언
DelegateTest delegate4 = (a, b)
{
	Console.WirteLine("a + b = " + (a + b));
};

📌 delegate 사용

// C#

    // 반환형 void, 파라미터 없는 delegate 생성
    delegate void delegateFunc();
    
    class MessageProcess
    {
        // delegate 선언
        delegateFunc OkFunc;
        delegateFunc CancelFunc;

        // 파라미터로 delegate 메소드를 받음
        public void ShowMessage(string msg, delegateFunc okFunc, delegateFunc cancelFunc)
        {
            OkFunc = okFunc;
            CancelFunc = cancelFunc;

            Console.WriteLine("Message : " + msg + " (0 : OK, else : Cancel)");

            string inputStr = Console.ReadLine();

            if (inputStr.Equals("0"))
            {
                OkFunc();
            }
            else
            {
                CancelFunc();
            }
        }
    }
    
    class Program
    {
        static void CallOK()
        {
            Console.WriteLine("Call OK");
        }
        static void CallCancel()
        {
            Console.WriteLine("Call Cancel");
        }
        static void Main(string[] args)
        {
            MessageProcess msg = new MessageProcess();
            msg.ShowMessage("Test Message", CallOK, CallCancel);

            // 파라미터에 익명 함수로 구현과 전달을 한번에
            msg.ShowMessage("Test Message",
                delegate ()
            {
                Console.WriteLine("Call InDelegate");
            }
            , CallCancel);
        }
    }

📌 delegate chain

// C#
delegate void ShowMessage();

class Message
{
	public void FirstMessage()
    {
    	Console.WriteLine("First Message");
    }
    
    public void SecondMessage()
    {
    	Console.WriteLine("Second Message");
    }

	pubilc void Main()
    {
    ShowMessage message = new ShowMessage(FirstMessage);
    message += SecondMessage; // 하나 더 참조
    message(); // 두 메서드 모두 호출
    
    // += 연산자를 이용하여 여러 메서드를 참조할 수 있다.
    // -= 연산자를 사용하여 메서드 참조를 제외할 수 있다.
    }
}

 

📌 event란?

- 하는 일은 delegate와 유사하다.

delegate와 차이점

- 할당 연산자(=) 사용 불가

- 클래스 외부 호출 불가

- 클래스 멤버 필드에서 사용

- delegate를 event 변수로 사용한다.

📌 event 사용

// C#

    delegate void delegateEvent(string message);

    class InDelegate
    {
        public delegateEvent myDelegate; // delegate 선언
        public event delegateEvent myEvent; // event 선언

        public void DoEvent(int a, int b)
        {
            if (myEvent != null)
            {
                myEvent("Event : " + (a + b));
            }
        }
    }
    class Program
    {
        static public void ConsoleFunc(string message)
        {
            Console.WriteLine("ConsoleFunc : " + message);
        }
        static void Main(string[] args)
        {
            InDelegate id = new InDelegate(); // InDelegate 객체 생성

            // id.myEvent += new delegateEvent(ConsoleFunc); // id 객체 안에 있는 myEvent에 ConsoleFunc 메소드를 참조
            id.myEvent += ConsoleFunc; // id 객체 안에 있는 myEvent에 ConsoleFunc 메소드를 참조

            // id.myEvent = ConsoleFunc; // event는 할당 연산자 사용 불가
            // id.myEvent("test"); // event는 클래스 외부에서 직접 호출 불가능
            // id.myDelegate = ConsoleFunc; // delegate는 할당 연산자 사용 가능
            // id.myDelegate("test"); // delegate는 클래스 외부에서 직접호출 가능

            for (int i = 0; i < 10; i++)
            {
                if (i == 9)
                {
                    // i가 9일 때 ConsoleFunc를 제외
                    id.myEvent -= ConsoleFunc;
                }
                id.DoEvent(i + 1, i + 2);
            }
        }
    }

 

💡 TIP

클래스 내에서 처리할 때는 event를 활용

콜백을 처리할 때는 메소드의 파라미터로 delegate를 활용

profile
복습하기 위해 쓰는 글

0개의 댓글