위임과 이벤트(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; }
}
}
}