C#

대리자와 이벤트

Barbarian developer 2024. 11. 1.

대리자(Delegator)

  • 코드(메소드)를 대신 실행하는 객체
  • 메소드를 호출하듯 사용(즉, 인수를 입력하고 결과를 반환 받음)
  • 단, 대리자가 실행할 코드는 컴파일 시점이 아닌 실행 시점에 결정

대리자의 선언과 사용

delegate 키워드를 이용하여 선언

메소드와 같이 대리자 또한 매개변수 목록과 반환 형식을 가짐

한정자 delegat e반환형식 델리게이트이름 (매개변수_목록);

 

대리자의 선언과 사용의 예

MyDelegate Callback;

Callback = new MyDelegate(Plus);
Console.WriteLine(Callback(3,4));

Callback = new MyDelegate(Minus);
Consloe.WriteLine(Callback(7,5));

 

익명 메소드

다른 코드 블록에서 재사용될 일이 없는 이름 없는 메소드 

익명 메소드 구현 절차

 

1. 사전 정의된 대리자 형식(반환형식, 매개변수)에 맞춰 익명 메소드 작성

2. 익명 메소드 정의시 delegate키워드로 시작하며, 정의된 코드는 대리자 참조에 할당

3. 익명 메소드를 할당받은 대리자 참조 호출

 

대리자 참조 = delegate (매개변수_목록)
        {
            	//익명 메소드 본문
            }
public static void Main()
{
	Calculate Calc;
    Calc = delegate(int a, int b)
    		{
            	return a+b;
            }
  	Console.WriteLine( "3+4 : {0}", Calc (3,4));
}

 

이벤트

객체의 사건을 표한하는 형식

이벤트 처리기 : 이벤트 발생시 실행되는 메소드

동작원리는 대리자와 유사 

이벤트는 외부에서 직접 "호출"할 수 없음. 객체의 은닉성 표현을 위해

대리자를 event 한정자로 수식하여 선언

 

이벤트: 객체에 일어난 사건 알리기

  1. 대리자를 선언합니다. 이 대리자는 클래스 밖에 선언해도 되고 안에 선언해도 됩니다.
  2. 클래스 내에 1에서 선언한 대리자의 인스턴스를 event 한정자로 수식해서 선언합니다.
  3. 이벤트 핸들러를 작성합니다. 이벤트 핸들러는 1에서 선언한 대리자와 일치하는 메소드면 됩니다.
  4. 클래스 인스턴스를 생성하고, 이 객체의 이벤트에 3에서 작성한 이벤트 핸들러를 등록합니다.
  5. 이벤트 발생하면 이벤트 핸들러가 호출됩니다.

step.1

대리자를 선언합니다.

delegate void EventHandler(string message);

 

step.2

클래스 내에 step1에서 선언한 대리자의 인스턴스를 event 한정사로 수식해서 선언합니다.

class MyNotifier
{
	pulic event EventHandler SomethingHappened;
    
    public void DoSomething(int number)
    {
    	int temp - number % 10;
        
        if(temp != 0 && temp % 3 ==0)
        {
        	SomethingHappend(String.Format("{0} : 짝", number));
        }
    }
}

 

step3

이벤트 핸들러를 작성합니다. 이벤트 핸들러는  step1에서 선언한 대리자와 일치하는 메소드면 됩니다.

class MainApp
{
	static public void MyHandler(string message)
    {
    	Console.WriteLine(message);
    }
    
    //...
}

 

step4

클래스의 인스턴스를 생성하고 이 객체의 이벤트에 step3에서 작성한 이벤트 핸들러를 등록합니다.

class MainApp
{
	static public void MyHandler(string message)
    {
    	Console.WriteLine(message);
    }
    
    static void Main(stringp[] args)
    {
    MyNotifier notifier = new MyNotifier();
    notifier;SomethingHappended += new EventHandler(MyHandler);
    
    for (int i = 1; i<30; i++)
    {
    	notifier.DoSomething(i);
    }
}

 

step5

이벤트가 발생하면 이벤트 핸들러가 호출됩니다.

class MainApp
{
	static public void MyHandler(string meassage)
    {
    	Consloe.WriteLine(message)
    }
    
    static void Main(string[] args)
    {
    	MyNotifier notifier = new MyNotifier();
        notifier.SomethingHappened += MyHandler;
        
        for(int i = 1; i < 30; i++)
        {
        	notifier.DoSomething(i);
        }
    }
}

 

using System;
using System.ComponentModel.DataAnnotations;

namespace EventTest
{
    delegate void EventHandler(string message);

    class MyNotifier
    {
        public event EventHandler SomethingHappened;
        public void DoSomething(int number)
        {
            int temp = number % 10;

            if(temp != 0 && temp % 3 ==0)
            {
                SomethingHappened(String.Format("{0} : 짝", number));
            }
        }

        class MainApp
        {
            static public void MyHandler(string message)
            {
                Console.WriteLine(message);
            }

            static void Main(string[] args)
            {
                MyNotifier notifier = new MyNotifier();
                notifier.SomethingHappened += new EventHandler(MyHandler);

                for(int i = 1; i<30; i++)
                {
                    notifier.DoSomething(i);
                }
            }
        }
    }
}

 

<실행결과>

 

대리자와 이벤트

이벤트는 대리자에 event 키워드로 수식해서 선언한 것에 불과합니다. 이벤트와 대리자와 가장 크게 다른 점은 이벤트를 외부에서 직접 사용할 수 없다는데 있습니다.

delegate void EventHandler(string message);

class MyNotifier
{
	public event EvenHandler SomethingHappened;
    
    // ...
}

class MainApp
{
	static void Main(string[] args)
    {
    	MyNotifier notifier = new MyNotifier();
        notifier.SomethingHappened("테스트"); //에러! 이벤트는 객체 외부에서 직접 호출할 수 없습니다.
    }
}

 

'C#' 카테고리의 다른 글

네트워크 프로그래밍  (0) 2024.11.04
Task  (0) 2024.11.03
프로그래밍  (0) 2024.11.01
배열과 컬렉션 그리고 인덱서  (0) 2024.11.01
프로퍼티  (3) 2024.11.01

댓글