개요
컴퓨터의 사건에 반응하는 프로그램을 만드는 방법
* 컴퓨터의 사건(이벤트) : 키 입력, 파일의 복사 등..
대리자
대리자는 누군가를 대신해서 일해주는 것으로 C#에서 Callback을 맡아 실행하는 일을 대리자가 담당한다.
대리자는 메소드(함수)에 대한 참조로 메소드의 주소를 할당한 후 대리자를 호출하면 대리자가 메소드를 호출한다.
[한정자] delegate [함수의 모양]
public delegate int MyDeligate(int a, int b);
public MyDeligate myDeligate;
// int (int,int) 모양의 함수를 받을 수 있는 myDeligate 대리자 객체를 만들었다.
MyDeligate는 int, string과 같은 타입 형식이며,
인스턴스를 생성하여 메소드(함수)를 참조하는 객체를 생성할 수 있다.
using System;
namespace Delegate
{
delegate int MyDelegate(int a, int b);
class Calculator
{
public int Plus(int a, int b)
{
return a + b;
}
public static int Minus(int a, int b)
{
return a - b;
}
}
class MainApp
{
static void Main(string[] args)
{
Calculator Calc = new Calculator();
MyDelegate Callback;
Callback = new MyDelegate(Calc.Plus);
Console.WriteLine(Callback(3, 4));
Callback = new MyDelegate(Calculator.Minus);
Console.WriteLine(Callback(7, 5));
}
}
}
대리자는 값이 아닌 코드(메소드)를 매개변수로 넘기고 싶을 때 사용할 수 있다.
일반화 대리자
탬플릿을 활용하여 일반화 대리자를 만들 수 있다.
delegate int Compare<T>(T a , T b);
대리자 체인
대리자는 여러 메소드(함수)를 참조할 수 있다.
// 이 부분 코드와 이미지로 표현 필요
익명 메소드
접근자, 이름이 없는 메소드
대리자와 이벤트
이벤트는 클래스 외부에서 직접 사용할 수 없다는 특징이 있다.
이벤트를 사용하여 견고한 프로그래밍을 기대할 수 있다.
Action / Func
Action과 Func는 .NET에서 미리 만들어 놓은 대리자이다.
Action<T> 대리자 (System)
매개 변수가 하나이고 값을 반환하지 않는 메서드를 캡슐화합니다.
docs.microsoft.com
Func<TResult> 대리자 (System)
매개 변수가 없고 TResult 매개 변수에 지정된 형식의 값을 반환하는 메서드를 캡슐화합니다.
docs.microsoft.com
Action과 Func의 차이는 반환 타입의 유무이다.
public delegate void Action<in T>(T arg);
public delegate TResult Func<in T, out TResult>(T arg);
Event
[한정자] event [delegate 타입] [객체이름];
public event Action Onsomething; // Action타입의 OnSometing 객체가 만들어짐
옵저버 패턴을 쉽게 사용하기 위한 타입이다.
선언된 대리자 타입의 함수를 보관할 수 있다.
대리자와 다르게 외부에서 Invoke()를 할 수 없다.
함수가 중복되어 추가 된다면 디버깅이 어렵기 때문에 꼭 추가하기 전에는 삭제를 해준다.
이벤트 객체에 아무런 함수도 없는 경우에는 null이기 때문에 Invoke()를 호출할 때는 꼭 null체크를 해준다.
활용 방법은 'Event'의 의미대로 특정 사건 (혹은 시점)을 나타내며, 그 시점에서 일어나야 하는 일들(코드 상에서는 메소드로 표현)을 일어나게 할 수 있다.
주의 사항
(1) 특정 시점이 됐는데 Invoke() 호출이 누락된 경우
(2) Invoke()가 호출될 때 실행되어야 할 메소드가 추가되지 않은 경우
추가
대리자의 접근 한정자를 private으로 설정하면
evnet처럼 외부에서 Invoke()가 불가능하지만, 외부에서 데이터도 받아올 수 없는 차이가 있다.
* event도 접근 한정자를 private으로 하면 외부에서 받아올 수 없는 차이가 있다.
'Program > C (C++,C#)' 카테고리의 다른 글
추상 클래스 vs 인터페이스 (0) | 2023.02.07 |
---|---|
[C#] Property (0) | 2022.08.16 |
[C#] 파일 다루기 (0) | 2022.08.10 |
[C++] 해시 테이블 (0) | 2022.07.06 |
[C++] 힙 (Heap) (0) | 2022.07.06 |