'Program > C#' 카테고리의 다른 글
C#으로 구현한 사이트 로그인 후 문서 가져오기 (0) | 2010.03.19 |
---|---|
타임서버 데이타 취하기 (0) | 2010.03.19 |
닷넷 응용 프로그램의 설치 및 배포 #2 (0) | 2010.03.07 |
닷넷 응용 프로그램의 설치 및 배포 #1 (0) | 2010.03.07 |
시스템 사양 알아내기~ (0) | 2010.03.07 |
C#으로 구현한 사이트 로그인 후 문서 가져오기 (0) | 2010.03.19 |
---|---|
타임서버 데이타 취하기 (0) | 2010.03.19 |
닷넷 응용 프로그램의 설치 및 배포 #2 (0) | 2010.03.07 |
닷넷 응용 프로그램의 설치 및 배포 #1 (0) | 2010.03.07 |
시스템 사양 알아내기~ (0) | 2010.03.07 |
책찾아보시면 많이나오죠. 근데 저도 막상 보면 잘모르겟던데요.
그래서 제가 나름데로 개발할때 경험상으로 이해한것을 설명해보겠습니다.
1. 개념
만약 어떤 기능을 실행하는 메소드를 호출할 필요가 있을때, 그냥 직접적으로 호출하는 형식입니다.
델리게이트는 호출하는코드랑 호출되는메서드 사이에 있다고 생각하면 됩니다.
어떤 메소드를 호출한다고할때.
델리게이트 사용 : 메소드호출 ---> 델리게이트 ---> 호출당하는 메소드
일반적인메소드호출 : 메소드호출 ---> 호출당하는 메소드
즉. 메소트호출쪽은 호출되는메소드를 직접 부르는 것이 아니고 델리게이트를 대신 부르게 됩니다.
이처럼 중간자(대리자)역활을 합니다.
2. 왜 사용하는지
한마디로 유연성입니다.
저도 첨에책으로만 볼땐 그래서 머! 걍호출하면 되지 웨 써 복잡하게라고 생각했었습니다.
예를들어 폼위에 버튼을 올려놓고 클릭을 하게 되면 클릭이벤트로 가게되죠?
이건 마소에서 처음 .net을 개발할때 버튼콘트롤 소스하고 버튼클릭이벤트메소드(예:button1_Click)
를 델리게이트로 연결했기 때문에 우리가 볼땐 콘트롤을 누르면 이벤트메소드로 가는것처럼 보이는겁니다.
뒤에서는 델리게이트가 중간에 연결을 해주고 있죠!
좀이해가 안가시죠. 그럼 어디에 사용하는지 한번 보죠.
3. 어디에 사용하는지
이걸 응용하자면 엄청 많을 것 같은데..
1..한번에 10개의 매소드를 실행하고 싶을때.
10개의 메소드를 전부 호출하는 것이 아니고.
델리게이트를 걸어서 델리게이트를 한번호출합니다.
2..비동기처리에 사용합니다.
예를들어 어떤 이벤트가 발생되서 실행되는
A라는 메소드가 있는데 이놈은 한번 실행하면 최소 10분이상걸리는 놈입니다.]
보통 델리게이트를 사용하지 않았을 경우 이놈이 끝날때까지 기다린후,다른 처리를 하게되는데.
델리게이트걸어 비동기화 시켜주게되면 일단 실행이 되고,
실행이 끝나던말든 다음처리를 할수 있습니다.
이걸,멀티캐스팅이라고 하나요.
↓비동기처리의 예
using System; delegate void ShowMessageDelegate(string msg); class Callable { internal void ConcreteShowMessage(string msg) { System.Threading.Thread.Sleep(5 * 1000); Console.WriteLine(msg); } } class Caller { internal ShowMessageDelegate ShowMessage; internal IAsyncResult CallDelegate() { IAsyncResult ret = ShowMessage.BeginInvoke("hello, from delegate!", new AsyncCallback(Callback), ShowMessage); return ret; } internal void Callback(IAsyncResult ar) { ShowMessageDelegate usedDelegate = (ShowMessageDelegate)ar.AsyncState; usedDelegate.EndInvoke(ar); } } class App { static void Main() { Callable callable = new Callable(); Caller caller = new Caller(); caller.ShowMessage = new ShowMessageDelegate(callable.ConcreteShowMessage); IAsyncResult ar = caller.CallDelegate(); while(!ar.IsCompleted) { System.Threading.Thread.Sleep(500); Console.Write("."); } Console.WriteLine("Done."); } } |
소스 설명은 뺐습니다.
[출처] Delegate 사용 2|작성자 니시오카
닷넷 응용 프로그램의 설치 및 배포 #1 (0) | 2010.03.07 |
---|---|
시스템 사양 알아내기~ (0) | 2010.03.07 |
Delegate 사용 (0) | 2010.03.07 |
[ASP.NET] Referrer 속성으로 사이트 방문시 유입 경로 알아내기 (0) | 2010.03.05 |
주사위놀이 (0) | 2010.02.09 |
//델리게이트 & 이벤트
//메서드의 대리자
//메서드를 보다 효율적으로 사용하기 위하여 특정 메서드 자체를 캡슐화 할수
있게 만들어 주는 방법
//델리게이트를 사용하려면 어떤 메서드를 호출할 것인지 컴파일할 시점이 아닌 프로그램을 실행하는 런타임 상황에서
결정할 수 있다.
//1단계 - Delegate할 메서드 정의
using System;
class
Atype
{
public void F1() //Delegate 할
Method1
{
Console.WriteLine("Atype.F1");
}
public void F2(int
x) //Delegate 할 Method2
{
Console.WriteLine("Atype.F2
=x"+x);
}
}
//2단계 - Method에 맞는 Delegate 선언
using
System;
delegate void SimpleDelegate1(); // Delegate 선언1 --> void
F1()
delegate void SimpleDelegate2(); // Delegate 선언2 --> void
F2()
class Atype
{
public void F1() //Delegate 할
Method1
{
Console.WriteLine("Atype.F1");
}
public void F2(int
x) //Delegate 할 Method2
{
Console.WriteLine("Atype.F2
=x"+x);
}
}
//3단계 - 임의의 객체 생성
//Delegate할 Method를 정하고 Delegate를 선언했다면, 이제 Method가 포함된
Class의 객체를 만들어야 한다. 그래야 특정 객체의 메서드가 하나의 독립적인 Delegate로서 활동 할수 있다.
using System;
delegate void SimpleDelegate1(); // Delegate 선언1
--> void F1()
delegate void SimpleDelegate2(int i); // Delegate 선언2 -->
void F2()
class Atype
{
public void F1() //Delegate 할
Method1
{
Console.WriteLine("Atype.F1");
}
public void F2(int
x) //Delegate 할 Method2
{
Console.WriteLine("Atype.F2
=x"+x);
}
}
class DeleTest
{
public static void
Main()
{
Atype atype = new Atype(); // 객체(Instance)
생성
}
}
//4단계 - Delegate 생성과 호출
using System;
delegate void
SimpleDelegate1(); // Delegate 선언1 --> void F1()
delegate void
SimpleDelegate2(int i); // Delegate 선언2 --> void F2()
class
Atype
{
public void F1() //Delegate 할
Method1
{
Console.WriteLine("Atype.F1");
}
public void F2(int
x) //Delegate 할 Method2
{
Console.WriteLine("Atype.F2
=x"+x);
}
}
class DeleTest
{
public static void
Main()
{
Atype atype = new Atype(); // 객체(Instance)
생성
SimpleDelegate1 s1 = new SimpleDelegate1(atype.F1); //Delegate
생성
SimpleDelegate2 s2 = new SimpleDelegate2(atype.F2); //Delegate
생성
s1(); //Delegate를 이용한 호출1
s2(1000); // Delegate를 이용한
호출2
}
}
//메소드 호출 : 일반 메소드 & 인스턴스 메소드
using
System;
namespace delegateEX
{
public delegate void MyDelegate(int x);
//델리게이트 선언
class MyClass
{
public static void Test(int
x)
{
Console.WriteLine("Test 메서드의 x 값은 : {0}",x);
}
public
static void Test2(int x)
{
Console.WriteLine("Test2 메서드의 x 값은 :
{0}",x);
}
class Class1
{
[STAThread]
static void
Main(string[] args)
{
MyClass.Test(100); //일반 메소드 호출
형식
//Test델리게이트 Instance
생성
MyDelegate MD = new MyDelegate(MyClass.Test);
MD(100); //
델리게이트를 통한 호출
MD = new
MyDelegate(MyClass.Test2);
MD(200);
}
}
}
}
//하나의 Delegate에 여러개의 Delegate등록
using System;
delegate void TopDelegator(string str);
//Delegate Declare
class Top
{
public static void StaticMethod(string
str)
{
Console.WriteLine("static Method
\t");
Console.WriteLine(str);
}
public void NormalMethod(string
str)
{
Console.WriteLine("Normal Method
\t");
Console.WriteLine(str);
}
}
class
MultiDelegateTest
{
public static void Main()
{
Top t = new
Top(); //클래스 인스턴스화
TopDelegator bank;
TopDelegator td1 = new
TopDelegator(t.NormalMethod); // 델리게이트 인스턴스화
TopDelegator td2 = new
TopDelegator(Top.StaticMethod); // 델리게이트 인스턴스화
bank = td1;
bank("add TopDelegator
1"); // 하나의 delegate 호출
bank += td2;
bank("add TopDelegator 2");
// 두개의 delegate 호출
bank -= td1;
bank("remove topDelegator
1"); // Delegate 제거
}
}
using System;
namespace DelegateEX
{
public delegate void MyDelegate(string
message);//Delegate 선언
class MyClass
{
public string message; //string 변수선언
public void Process(MyDelegate mydelegate) // 공용 메소드
선언
{
mydelegate(message);//선언한 string 변수 삽입
}
}
class Class1
{
public static void DisplayMessage1(string
message)
{
Console.WriteLine("DisplayMessage1 : {0}",
message);
}
public void DisplayMessage2(string
message)
{
Console.WriteLine("DisplayMessage2 :
{0}",message);
}
[STAThread]
static void Main(string[] args)
{
MyClass mc =
new MyClass(); // 초기화
mc.message ="cookee";
MyDelegate md1 = new
MyDelegate(DisplayMessage1);
mc.Process(md1);
mc.message = "cookee2";
MyDelegate md2 = new MyDelegate(new
Class1().DisplayMessage2);
mc.Process(md2);
}
}
}
using System;
namespace DelegateEX
{
public
delegate int MyDelegate(int i, string s);//반환값이 Int, string 매개변수가 두개인 델리게이트
선언.
class Class1
{
public
MyDelegate my; //MyDelegate형 my 선언.
public int Hello(int i,string s) // my가 호출되었을때 실행할 메소드
작성
{
Console.WriteLine("Hello MyDelegate my -- {0}",s);
return
i;
}
[STAThread]
static void Main(string[] args)
{
Class1 cs =
new Class1();//초기화..
cs.my = new MyDelegate(cs.Hello);//my변수에 처리할 메소드 Hello
할당.
int i = cs.my(2,"cookee"); // 델리게이트형 변수 my
실행.
Console.WriteLine(i);
}
}
}
using System;
namespace DelegateEX
{
public delegate void MyDelegate();//void 이고 인자가
없는 delegate 선언.
class Class1 //서로다른 클래스 : Class1
{
public event MyDelegate my;
//MyDelegate형 my 선언(my는 이벤트 변수가 된다.) event 키워드 붙인다.
public void Hello() // my가 실행할 메소드 작성
{
Console.WriteLine("다른
클래스에서 인자없고 반환없는 델리게이트 실행한 결과");
}
public void TriggerEvent() //이벤트 받는 메소드
{
this.my(); //이벤트 메소드
내에서 Event my()실행.
}
}
class execute //서로다른 메인클래스
{
[STAThread]
static void
Main(string[] args)
{
Class1 cs = new Class1();//초기화..
cs.my += new MyDelegate(cs.Hello);//델리게이트변수 my가 처리할 메소드 Hello를
할당.
cs.TriggerEvent(); //이벤트를 받을 메소드 부름.
}
}
}
//=========================== 1 =========================================================
using System;
namespace DelegateEX
{
public delegate void MyEventHandler2(string s);
//델리게이트 선언
class myButton2
{
public event MyEventHandler2 Event; // delegate형
이벤트 등록.
public void button2_Click(string
val)
{
Console.WriteLine("{0} : 버튼에서 이벤트 발생
:",val);
}
public void button3_Click(string
val)
{
Console.WriteLine("{0} : 버튼에서 또 이벤트 발생
:",val);
}
static void Main(string[] args)
{
myButton2 ok =
new myButton2();
//이벤트 발생
ok.Event += new MyEventHandler2(ok.button2_Click);
//이벤트 추가
ok.Event += new
MyEventHandler2(ok.button3_Click);
ok.Event("cookee");
}
}
}
Delegate - 8. 윈폼띄우기
using System;
using
System.Drawing;//솔루션탐색기에서 참조추가 해준다.
using System.Windows.Forms;//마찬가지로 참조추가
해준다.
namespace DelegateEX
{
public class EventCall
{
public static
void Hello(object
sender, EventArgs e)
{
Console.WriteLine("Hello 메소드
실행!!");
}
public static void cookee(object sender, EventArgs e)
{
int x =
100, y=100;
Console.WriteLine("cookee");
Form frm1 = new Form();
Button btn2 = new Button();
btn2.Text = "버튼2";
x = x + btn2.Location.X;
y = y + btn2.Location.Y;
btn2.Location = new
Point(x,y);
frm1.Controls.Add(btn2);
frm1.Show();
Console.WriteLine("cookee매소드 실행!!");
}
public static void Main(string[] args)
{
Form f = new
Form();
Button btn = new Button();
//버튼 속성
지정
btn.Text = "버튼을 누르면 Hello 메소드실행! ";
btn.Location = new
Point(100,100); // point 구조체의 생성자에 할당.
btn.Size = new Size(200,30);//size
구조체의 생성자에 할당.
btn.ForeColor = Color.Black;
btn.BackColor =
Color.Red;
f.Controls.Add(btn);
btn.Click += new EventHandler(Hello);
Button btn1 = new Button();
btn1.Text = "버튼위에 마우스커서를 올려놓으면 cookee
메소드실행 ";
btn1.Size = new Size(180,50);
btn1.BackColor =
Color.Yellow;
btn.Location = new
Point(50,100);
f.Controls.Add(btn1);
btn1.MouseHover += new
EventHandler(cookee);//버튼위에 올려놓으면 새로운 Form이 뜬다.
Application.Run(f);
}
}
}
[출처] Delegate 의 사용|작성자 니시오카
시스템 사양 알아내기~ (0) | 2010.03.07 |
---|---|
Delegate 사용 2 (0) | 2010.03.07 |
[ASP.NET] Referrer 속성으로 사이트 방문시 유입 경로 알아내기 (0) | 2010.03.05 |
주사위놀이 (0) | 2010.02.09 |
Silent Install of MS .Net Framework Version 2 (0) | 2010.02.05 |