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);
}
}
cfile23.uf.1960053750AEC2471AC2D0.zip
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());
}
}
}
cfile10.uf.1851933C50AEC2481F89BF.zip
댓글 없음:
댓글 쓰기