Delegate






Delegate 란 메서드의 시그내처 정보를 가지고 있는 포인터 이다. Delegate 가 사용되는 곳으로는 이벤트, 스레드, 비동기, 람다 가 있다.












Delegate 를 사용하는 3가지 단계가 있다. 외워라!!
1. 선언 : 선언은 Delegate  가 가르키게 될 메소드의 시그내처를 선언한다.
ex) delegate void MyDelegate1(string s)
2. 생성 : Delegate 는 메소드를 가르키게 되지만 컴파일 되면 하나의 클래스 객체가 된다. 이를 증명하듯 생성 시에는  new 연산자를 사용한다. 매개변수에는 가리킬 메소드 이름을 지정해 준다.
ex) MyDelegate1 a = new MyDelegate1(MyClass.Hello);
3. 호출 : 해당 메소드를 호출하듯 Delegate 이름을 이용하여 호출한다.
ex) a("Word");









Delegate 는 Single Delegate 와 Multicast Delegate 가 있다. Single delegate 는 하나의 메소드를 가리키고, Multi delegate 는 여러개의 메소드를 가리키게 된다. Single delegate 와 Multi delegate 의 구분은 해당 delegate 시그내처의 리턴값을 보고 판별한다. 즉, 리턴값이 있다면 single delegate 이고 리턴값이 없다면 Multi delegate 이다. Multi delegate 가 여러개의 메소드를 가리키고 있지만 해당 메소드는 순차적으로 실행이 되며, 여러개의 메소드 중 어느 하나의 리턴값을 정하긴 모하 하므로 Multi delegate 는 보통 리턴값을 갖지 않는다.

예제)
public partial class Form1 : Form
{
    delegate void MyDelegate();

    public Form1()
    {
         InitializeComponent();
     }

     private void button1_Click(object sender, EventArgs e)
     {
            // SetColor(); 직접 호출

            // 생성
            // MyDelegate md = new MyDelegate(SetColor);
            // MyDelegate md2 = new MyDelegate(SetText);
            // MyDelegate md3 = new MyDelegate(SetLocation);
            // MyDelegate md4 = (MyDelegate)Delegate.Combine(md, md2, md3);
            // md4();

            // C# 의존 문법
            MyDelegate md = new MyDelegate(SetColor);
            md += new MyDelegate(SetText);
            md += new MyDelegate(SetLocation);
            md();            
      }
        
      public void SetColor()
      {
            button1.BackColor = Color.Green;
      }

      public void SetText()
      {
            button1.Text = "델리게이트";
      }

      public void SetLocation()
      {
            button1.Location = new Point(100, 100);
      }
}







Delegate 비동기 방식 사용

BeginInvoke, EndInvoke메소드 사용
자세한 사용법은 뒤에서 알아 본다고 한다....

namespace DelegateDemo_15
{
    // 선언
    public delegate int AddDelegate(int i, int j);

    public class MyClass
    {
        public int AddTo(int i, int j)
        {
            System.Threading.Thread.Sleep(4000);
            return i + j;
        }
    }
}

namespace DelegateDemo_15
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            MyClass mc = new MyClass();

            // 생성
            AddDelegate ad = new AddDelegate(mc.AddTo);

            // 호출 (동기 방식 호출)
            // int num = ad(int.Parse(textBox1.Text), int.Parse(textBox2.Text));
            // MessageBox.Show(num.ToString());

            // 호출2 (비동기 방식 호출)
            AsyncCallback ac = new AsyncCallback(CallBack);
            ad.BeginInvoke(int.Parse(textBox1.Text), int.Parse(textBox2.Text), ac, ad);
            MessageBox.Show("4초 후에 결과가 출력됩니다.");
        }

        public void CallBack(IAsyncResult ar)
        {
            AddDelegate ad = (AddDelegate)ar.AsyncState;
            int num = ad.EndInvoke(ar);

            MessageBox.Show(num.ToString());
        }
    }
}

Posted by six605
,