[C#기초] 5. 델리게이트와 이벤트
INDEX
델리게이트
델리게이트
- 복수 또는 단일 메서드를 대신해서 호출하는 역할 -> 같은 형식이어야 한다
- 메서드만 호출 가능
- 외부에서 호출 가능 (
private
,protected
메서드는 호출 불가) - 델리게이트의 본질은 메서드 참조형
- 델리게이트와 이벤트는 윈도우 폼을 만들 때 사용됨
델리게이트 형식
-
델리게이트 선언
[접근한정자] delegate return형 델리게이트형명(메서드 매개변수);
delegate int DeligateTypes(string Name);
-
C# 1.0에서
델리게이트형 델리게이트명 new 델리게이트형명(ghcnfgkf aptjemaud);\
`DelegateType Delegatemethod = new DelegateType(Function);
-
C# 2.0에서
델리게이트형 델리게이트명 = 호출할 메서드명;
`DelegateType DelegateMethod = Function;
델리게이트 사용 예제 코드
delegate void DelegateType(string str); class A { public void print(string str) { Console.WriteLine(str); } } class Program { static void Main(string[] args) { A Test = new A(); DelegateType DelMethod1 = new DelegateType(Test.print); //C# 1.0 이상에서 사용 가능 DelMethod1("Hello World1!"); DelegateType DelMethod2 = Test.print; //C# 2.0 이상에서 사용 가능 DelMethod2("Hello World2!"); } }
결과
멀티캐스트 델리게이트
델리게이트 조합
- 역할
- 다수 또는 단일 메서드 호출
+=
,-=
(포함과 제거)- 호출할 메서드 포함 또는 제거
멀티캐스트 델리게이트 예제 코드
delegate void DelegateType(); class A { public void printA() { Console.WriteLine("PrintA"); } public void printB() { Console.WriteLine("PrintB"); } } class Program { static void Main(string[] args) { A Test = new A(); DelegateType DelFunc = Test.printA; DelFunc += Test.PrintB; DelFunc(); DelFunc -= Test.printB; DelFunc(); } }
결과
이벤트
개념
- delegate(외부) -> event(객체의 메서드 안)
- 윈도우 메시지에 따라 호출되는 이벤트는 결정 -> 자동생성 & 호출
특징
- 특정 상황이 발생했을 때 알리고자 하는 용도로 사용 (호출을 의미 + 데이터)
- 이벤트를 발생시키는 클래스를 게시자라고 함
- 이벤트를 받거나 처리하는 클래스를 구독자라고 함
- 델리게이트를 기반으로 한다 (메서드 호출)
- 이벤트는 메서드 안에서만 사용 가능
이벤트의 핵심
- 이벤트 핸들러에 객체의 메서드를 연결
- 이벤트 핸들러 객체 메서드에서의 호출
- 이벤트 핸들을 포함하는 객체 안의 메서드를 통해 다른 객체 또는 같은 객체의 메서드를 호출하기 위한 방법 (같은 데이터 전달)
이벤트 핸들러 매개변수
-
윈도우 이벤트 핸들러는 모두 같은 형식
private void Form1_Paint(object sender, PaintEventArgs e)
- sender
- 이벤트를 호출하는 객체 참조
- ovject상 클래스
- e
- 이벤트에 관련 정보를 제공하는 클래스
- System.Object
- System.EventArgs
- 이벤트에 관련 정보를 제공하는 클래스
- sender
이벤트 형식
-
[접근 한정자] event 델리게이트형 이벤트명
delegate void DelegateType(string message); class A { public event DelegateType EventHandler; public void Func(string Message) { EveneHandelr(Message); } }
이벤트 사용 예제
delegate void DelegateType(string Message); class A { public event DelegateType EventHandler; public void func(string Message) { EventHandler(Message); } } class B { public void PrintA(string Message) { Console.WriteLine("PrintA:"+Message); } public void PrintB(string Message) { Console.WriteLine("PrintB:"+Message); } } class Program { static void Main(string[] args) { A Test1 = new A(); B Test2 = new B(); Test1.EventHandler += new DelegateType(Test2.PrintA); Test1.EventHandler += new DelegateType(Test2.PrintB); Test1.func("Good!!"); Test1.EventHandler -= Test2.PrintB; Test1.func("Hi!"); Test1.EventHandler -= Test2.PrintA; Test1.EventHandler += Test2.PrintA; //처리기에 추가하기 Test1.EventHandler += Test2.PrintB; } }
결과
델리게이트와 이벤트 비교
델리게이트 | 이벤트 | |
---|---|---|
공통점 | 객체의 메서드 호출 | 객체의 메서드 호출 |
차이점 | 델리게이트로 호출 델리게이트에 연결 |
이벤트를 포함한 메서드에서 호출 이벤트 핸들러에 연결 |
속성 | 인덱서 | |
---|---|---|
공통점 | 객체의 멤버 변수를 R/W | 객체의 멤버 변수를 R/W |
차이점 | 변수 | 배열 |