본문 바로가기

   
Programming/Winform

위임과 이벤트(Delegate & Event)

반응형

위임과 이벤트(Delegate & Event)

        - 자료형(객체 생성 가능), 클래스의 일종, 멤버가 없고 구현부도 없다. => 메서드를 대신 호출만 한다.

        - 메서드를 대신 위임하여 호출하기 위해서 사용

       - 메서드의 실행을 대행하는 역할

       - 위임 객체 : 클래스와 마찬가지로 선언 후 객체 생성을 통해 사용

       - 위임의 형식은 호출할 메서드의 형식과 동일하게 선언

       - 객체 메서드 or 정적 메서드 모두 가능

 

위임 선언

       - public delegate 반환형 위임명(인자 리스트);

       - 위의 위임 객체는 동일한 형식의 메서드를 대신 호출한다.

 

       - public delegate void Sample(int x);

         1. public static void M1(int x);//0

         2. public void M2(int x);//0

         3. public int M3(int x);//X 반환타입이 틀려서

         4. public void M4(int x, int y);//X 인자갯수가 틀려서

         5. public void M5(string s);// X 인자타입이 틀려서

 

이벤트(Event) => 객체에서 일어날수 있는 사건

        - 클래스의 멤버, 클릭이벤트 발생이 되면 미리 준비된 코드를 실행(메서드 호출 => 위임객체 호출)

       - 동작을 수행하는 방식

       - 출판자(Publisher) : 이벤트를 발생하여 특정 구독자에게 이벤트 발생을 알려준다.

       - 구독자(Subscriber) : 특정 이벤트 발생 통보를 받고, 출판자로부터 호출되어질 메서드를 미리 등록한 객체

       - 이벤트 핸들러(Event Handler) : 호출되어지는 메서드

 

 using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Delegate

{

       //델리게이트 선언

       //void Plus(int n)

       public delegate void Sample(int n);

 

       class Delegate

       {

             static void Main(string[] args)

             {

                    Test t = new Test(10);

                    //+5 Plus()객체 메서드 호출

                    t.Plus(5);//** 직접 호출

                    Console.WriteLine(t.N);

 

                    //델리게이트 객체 생성

                    // - 메서드 주소값

                    Sample s = new Sample(t.Plus);

 

 

                    //델리게이트 호출(대리 실행)

                    s(5);//t.Plus를 호출 -> 5 Plus에게 전달

 

                    Console.WriteLine(t.N);

 

 

                    Sample s2 = new Sample(t.Minus);

                    s2(10);// t.Minus(10); 호출 동일

                    Console.WriteLine(t.N);

 

                    Test.Hello(100);

 

                    //정적 메서들 호출

                    Sample s3 = new Sample(Test.Hello);

                    //델리게이트를 통하여 호출

                    s3(200);

             }

       }

 

       class Test

       {

             private int n;

 

             public int N

             {

                    get { return this.n; }

             }

 

             public Test(int n)

             {

                    this.n = n;

             }

 

             //

             public void Plus(int n)

             {

                    this.n += n;

             }

 

             public void Minus(int n)

             {

                    this.n -= n;

             }

 

             public static void Hello(int n)

             {

                    Console.WriteLine(n);

             }

 

       }

}

 


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace DeleGate02

{

       public delegate void Sample(int x);

 

       class Delegate02

       {

             static void Main(string[] args)

             {

                    Test t = new Test(10);

 

                    Sample s = new Sample(t.Plus);

                    s(10); // 10 -> 20

 

                    //위임 연산(delete + delete)

                    Sample s2 = new Sample(t.Minus);

                    s2(5); // 20 -> 15

 

                    Sample s3 = s + s2;

                    s3(10); // 15 -> 15 // t.Plus + t.Minus

 

                    Console.WriteLine(t.N);

 

                    //s += s2;// s = s + s2;

 

                    //*** 가장 많이 보게될 구문

                    //1. 기존의 위임객체에 메서드를 추가하려면..

                    s3 += new Sample(Test.Hello);//s3 (P,M,H) x 3

                    s3(10);//t.Plus(10), t.Minus(10), Test.Hello(10)

 

                    //s3 = s3 - s;

                    //2. 기존의 위임객체에 메서드를 삭제하려면..

                    s3 -= new Sample(t.Plus);

 

                    Console.WriteLine(t.N);//15

                    s3(10);//t.Minus, Test.Hello

                    Console.WriteLine(t.N);//5

 

 

 

             }

       }

 

       class Test

       {

             private int n;

 

             public int N

             {

                    get { return this.n; }

             }

 

             public Test(int n)

             {

                    this.n = n;

             }

 

             //

             public void Plus(int n)

             {

                    this.n += n;

             }

 

             public void Minus(int n)

             {

                    this.n -= n;

             }

 

             public static void Hello(int n)

             {

                    Console.WriteLine(n);

             }

 

       }

}

 



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Go

{

       class Event01

       {

             static void Main(string[] args)

             {

                    //1. 버튼 생성

                    MyButton btn1 = new MyButton("버튼1");

 

                    //2. Click발생 -> 호출될 메서드

                    //Click 이벤트와 - 델리게이트가 - 실제 메서드 연결 작업을 해야한다.

                    //btn1객체에 Click 이벤트를 등록 했습니다.

                    //겔리게이트를 통하여 메소드를 등록 해놓으면 이벤트를 관리하는 뜻

                    btn1.Click += new ClickEvent(ButtonClick);

             }

 

             //이벤트가 발생하면 호출될 메서드

             //이벤트 발생하면 실행할 코드

             //이벤트 발생하면 이벤트를 처리할 코드

             //-> 이벤트 핸들러(Event Handler)

             //첫번쨰 인자 sender = btn1.Click += new ClickEvent(ButtonClick); 이저장 되어 있어 ClickEvent 형태이다.

             public static void ButtonClick(object sender, MyEventArgs args)

             {

                    //형변환

                    MyButton btn = (MyButton)sender;

                    Console.WriteLine(btn.Text);

             }

       }

 

       //위임 선언

       public delegate void ClickEvent(object sender, MyEventArgs args);

 

       //EventArgs : 사건이 터졌을때 사건과 관련된 정보를 가지는..

       public class MyEventArgs : EventArgs

       {

             private int clickCount;//클릭횟수

 

             public MyEventArgs(int count)

             {

                    this.clickCount = count;

             }

 

             public int ClickCount

             {

                    get { return this.clickCount; }

             }

       }

 

       public class MyButton

       {

             private string text;//버튼의 라벨

             public event ClickEvent Click;

 

             public MyButton() : this("") { } //생성자 초기리스트

 

             public MyButton(string text)

             {

                    this.text = text;

             }

 

             public string Text

             {

                    get { return text; }

                    set { text = value; }

             }

       }

}

 

 

반응형