대리자
- delegate 키워드를 사용하여 선언
한정자 delegate 반환형식 대리자이름 ( 매개변수 );
- 주의할 점은 대리자는 인스턴스가 아닌 형식(type)이라 인스턴스를 따로 만들어야 한다.
delegate int MyDelegate( int a, int b ); // 대리자
MyDelegate callback;
// 함수
int Plus(int a, int b) => a + b;
void SomeMethod()
{
callback = new MyDelegate(Plus);
Console.WriteLine(callback(3, 4);
}
일반화 대리자
- 대리자 또한 일반화 메서드도 참조할 수 있다.
delegate int Compare<T>(T a, T b);
대리자 체인
- 대리자는 += 연산자를 통해 여러 개를 동시 참조 가능하다.
- 체인을 끊을 때는 -= 연산자를 사용한다.
delegate void MyDelegate(string str);
void Call(string str){ }
void Call2(string str){ }
void TestMethod()
{
MyDelegate my = new MyDelegate(Call);
my += new MyDelegate(Call2);
}
// 간소화된 형태
void TestMethod2()
{
mydel del = new MyDelegate(MyMethod);
del += MyMethod;
}
익명 메서드
- delegate 키워드와 함께 사용하여 익명 메서드를 선언할 수 있다.
- 대리자가 참조해야 될 메서드가 두 번 다시 사용할 일이 없다고 판단될 때 사용함.
대리자인스턴스 = delegate( 매개변수 )
{
//...
}
delegate int Calculate(int a, int b)
public static void Main()
{
Calculate Calc;
Calc = delegate(int a, int b)
{
return a + b;
};
Console.WriteLine(Calc(3, 4));
}
이벤트
- 특정한 일이 생겼을 때 이를 알려주는 객체
delegate void EventHandler(string message); // 대리자 선언
class MyNotifier
{
public event EventHandler SomethingHappend; // 선언했던 대리자를 이용하여 event 선언
public void DoSome()
{
SomethingHappend("호출됨");
}
}
class MainApp
{
static public void MyHandler(string message) // 이벤트가 발생할때 처리할 메소드 작성
{
Console.WriteLine(message);
}
static void Main(string[] args)
{
MyNotifier notifier = new MyNotifier();
notifier.SomethingHappend += new EventHandler( MyHandler ); // 핸들러 등록
nodifier.DoSome();
// DoSome()을 호출하여 SomethingHappend 이벤트가 호출되고, 해당 이벤트에 등록되어있는
// MyHandler메소드가 호출된다.
}
}
대리자 vs 이벤트
- 그냥 일반 delegate 쓰면 될 텐데 왜 이벤트가 필요한 것인가?
이벤트는 외부에서 직접 사용할 수 없다!
(public으로 선언되어있어도 클래스 외부에서는 호출이 불가능하다)
- 대리자는 콜백 용도 / 이벤트는 객체의 상태변화나 사건의 발생을 알리는 용도로 사용하자.
'🌍 C# Study > C# 기초' 카테고리의 다른 글
C# 복습하기 14) LINQ (0) | 2021.04.13 |
---|---|
C# 복습하기 13) 람다식 (0) | 2021.04.13 |
C# 복습하기 11) 예외 처리 (0) | 2021.04.12 |
C# 복습하기 10) 일반화 프로그래밍 (0) | 2021.04.11 |
C# 복습하기 9) 배열, 컬렉션, 인덱서 (0) | 2021.04.11 |