대리자(위임/델리게이트)
- 대리자(delegate)는 매개변수 목록 및 반환 형식이 있는 메서드 참조(포인터)를 나타내는 형식
- 대리자는 함수 자체를 데이터 하나로 보고 의미 그대로 다른 메서드를 대신 실행하는 기능
- 한 번에 메서드 하나 이상을 대신해서 호출
- 내부적으로 MulticastDelegate 클래스에서 기능을 상속
using System;
class DelegateDemo
{
// 함수 생성 -> 매개변수도 없고 반환값도 없는 함수
static void Hi() => Console.WriteLine("Hi");
// 대리자 생성 -> 매개변수도 없고 반환값도 없는 함수를 대신 실행할 대리자
delegate void SayDelegate();
static void Main()
{
// Hi 함수를 say 이름으로 대신해서 호출
SayDelegate say = Hi;
say();
// Hi 함수를 hi 이름으로 대신해서 호출 : 또 다른 모양
var hi = new SayDelegate(Hi);
hi();
}
}
대리자에는 += 연산자를 사용하여 대신할 메서드를 하나 이상 등록 가능
💡 대리자 변수 += new 대리자(메서드이름);
메서드이름에 함수를 넣어 ‘함수 포인터’로 사용 가능
함수 포인터
> public delegate void Whats(); // 함수 포인터 형식
// 함수 포인터 정의
> Whats whats = delegate { Console.WriteLine("함수 포인터 == 대리자"); };
> whats(); // 함수포인터 호출
함수 포인터 == 대리자 // 결과
Action, Func, Predicate 대리자
- Action 대리자 : 반환값이 없는 메서드를 대신 호출
- Func 대리자 : 매개변수와 반환값이 있는 메서드를 대신 호출
- Predicate 대리자 : T 매개변수에 대한 bool 값을 반환하는 메서드를 대신 호출
이벤트
특정 상황이 발생할 때 개체 또는 클래스에서 알림을 제공할 수 있도록 하는 멤버
이벤트는 사건 및 사고 의미를 갖지만 프로그래밍에서는 특정 메서드가 실행되는 결과라는 의미가 큼
using System;
public class ButtonClass
{
// 이벤트 생성을 위한 대리자 하나 생성
public delegate void EventHandler(); // 메서드를 여러 개 호출 가능
// 이벤트 선언 : Click 이벤트
public event EventHandler Click;
// 이벤트 발생 메서드 : OnClick 이벤트 처리기(핸들러) 생성
public void OnClick()
{
if (Click != null) // 이벤트에 등록된 값이 있는지 확인(생략 가능)
{
Click(); // 대리자 형식의 이벤트 수행
}
}
}
class EventDemo
{
static void Main()
{
// Button 클래스의 인스턴스생성
ButtonClass btn = new ButtonClass();
// btn 개체의 Click 이벤트에 실행할 메서드들 등록
btn.Click += Hi1;
btn.Click += Hi2;
// 이벤트 처리기(발생 메서드)를 사용한 이벤트 발생: 다중 메서드 호출
btn.OnClick();
}
static void Hi1() => Console.WriteLine("C#");
static void Hi2() => Console.WriteLine(".NET");
}
'C# > C# 교과서' 카테고리의 다른 글
[C# 교과서] 44~45. 메서드 오버라이드, 인터페이스 (0) | 2023.01.30 |
---|---|
[C# 교과서] 42~43. 클래스 기타, 상속으로 클래스 확장하기 (0) | 2023.01.27 |
[C# 교과서] 38~39. 속성, 인덱서와 반복기 (0) | 2023.01.17 |
[C# 교과서] 35~37. 생성자, 소멸자, 메서드와 매개변수 (0) | 2023.01.11 |
[C# 교과서] 33~34. 네임스페이스, 필드 만들기 (2) | 2023.01.10 |