delegate 는 메서드를 가리킬 수 있는 타입의 간편 표기법.
event도 간편표기법. event를 사용하면 정형화된 콜백 패턴을 구현하려할때 코드를 줄일 수 있음.
- 조건
1. 클래스에서 이벤트(콜백)를 제공한다.
2. 외부에서 자유롭게 해당 이벤트(콜백)을 구독하거나 해지하는 것이 가능하다.
3. 외부에서 구독/해지는 가능하지만 이벤트 발생은 오직 내부에서만 가능하다.
4. 이벤트의 첫번째 인자는 이벤트를 발생시킨 타입의 인스턴스다.
5. 이벤트의 두번째 인자는 해당 이벤트에 속한 의미 있는 값이 제공된다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp
{
// 부모클래스는 사라지고 닷넷에서 제공하는 System.EventArgs라는 타입 사용
class PrimeCallbackArg : EventArgs
{
public int prime;
public PrimeCallbackArg(int _prime) { this.prime = _prime; }
}
// 소수 생성기
class PrimeGenerator
{
//기존의 AddDelegate, RemoveDelegate,PrimeDelegate는 없어짐.
public event EventHandler PrimeGenerated;
// 주어진 수까지 루프를 돌면서 소수가 발견되면 콜백메서드 호출 ****
public void Run(int _limit)
{
for (int i = 2; i <= _limit; i++)
{
// 콜백을 발생시킨 측의 인스턴스와 발견된 소수를 콜백메서드에 전달
if (Is_prime(i) &&
PrimeGenerated != null)
PrimeGenerated(this, new PrimeCallbackArg(i));
}
}
//소수 판정 메서드
public bool Is_prime(int _candidate)
{
if ((_candidate & 1) == 0)
return _candidate == 2;
for (int i = 3; (i * i) <= _candidate; i += 2)
{
if ((_candidate % i) == 0)
return false;
}
return _candidate != 1;
}
}
class Program
{
static int sum;
//콜백으로 등록될 메서드1
static void Print_prime(object _sender, EventArgs _arg) { Console.Write((_arg as PrimeCallbackArg).prime + ", "); }
//콜백으로 등록된 메서드2
static void Sum_prime(object _sender, EventArgs _arg) { sum += (_arg as PrimeCallbackArg).prime; }
static void Main(string[] args)
{
PrimeGenerator gen = new PrimeGenerator();
gen.PrimeGenerated += Print_prime;
gen.PrimeGenerated += Sum_prime;
// 1~10까지 소수를 구하고
gen.Run(10);
Console.WriteLine();
Console.WriteLine(sum);
//Sum prime 콜백메서드 제거후 1~15사이 소수 구하는 메서드 호출
gen.PrimeGenerated -= Sum_prime;
gen.Run(15);
}
}
}
'프로그래밍 언어 > C#' 카테고리의 다른 글
C# Boxing Unboxing 박싱 언박싱 값>참조, 참조>값 (0) | 2022.06.19 |
---|---|
C# 제네릭 (C++ > 템플릿) (0) | 2022.06.13 |
C# 사용자 정의 전환 연산자(암시적/명시적) (0) | 2022.06.08 |
C# LINQ (0) | 2022.06.07 |
C# 형변환 is as 키워드 (0) | 2022.06.05 |