이벤트를 사용하기전 대리자를 사용한 게시-구독에 대한 내용 정리.
대리자는 일단 멀티캐스트가 가능하다.
=> 여러개 메서드를 추가(+=)할 수 있다.
using System.Transactions;
namespace EX5.Event
{
internal class Program
{
static void Main(string[] args)
{
TempControler tempControler = new TempControler();
Heater heater = new Heater(50);
Cooler cooler = new Cooler(50);
string temp;
tempControler.OnTemperatureChanged += heater.OnTemperatureChanged;
tempControler.OnTemperatureChanged += cooler.OnTemperatureChanged;
Console.WriteLine("Enter Temp");
temp = Console.ReadLine();
tempControler.CurrentTemperature = int.Parse(temp);
}
}
}
// 대리자를 이용한 게시-구독 패턴
class Cooler
{
public Cooler(float temperature)
{
Temperature = temperature;
}
public float Temperature { get; set; }
public void OnTemperatureChanged(float newTemperature)
{
if(newTemperature > Temperature)
{
Console.WriteLine($"Coloer : On");
}
else
{
Console.WriteLine($"Coloer : Off");
}
}
}
class Heater
{
public Heater(float temperature)
{
Temperature = temperature;
}
public float Temperature { get; set; }
public void OnTemperatureChanged(float newTemperature)
{
if (newTemperature > Temperature)
{
Console.WriteLine($"Coloer : On");
}
else
{
Console.WriteLine($"Coloer : Off");
}
}
}
class TempControler
{
public Action<float>? OnTemperatureChanged { get; set; }
public float CurrentTemperature
{
get { return _CurrentTemperature; }
set
{
if(value != CurrentTemperature)
{
_CurrentTemperature = value;
// 구독자 호출
OnTemperatureChanged?.Invoke(value);
}
}
}
private float _CurrentTemperature;
}
Cooler 와 Heater가 구독자라고 한다.
TempController은 게시자라고 한다.
TempController의 OnTemperatureChanged를 Action 대리자로 생성하고
Main에서 TempController의 OnTemperatureChanged를 대리자에 구독자들의 OnTemperatureChanged 메서드를 할당했다.
그리고 TempController의 온도가 변하면 invoke를 통해 구독자들을 호출했다.
TempControler 의
OnTemperatureChanged?.Invoke(value);는
OnTemperatureChanged(value) 이렇게 사용해도 되는데 C#에 있는 NULL 검사를 사용하기 위해 OnTemperatureChanged?.Invoke(value); 이렇게 사용했다
Invoke() 메서드는 C#에서 델리게이트(delegate) 또는 이벤트를 호출하는 데 사용되는 방법 중 하나라고 한다.
Invoke() 메서드는 델리게이트가 참조하는 메서드를 실행하라는 명령을 내린다.
델리게이트 호출: 일반적으로 Invoke()는 델리게이트 인스턴스를 통해 연결된 메서드를 명시적으로 호출할 때 사용된다고 한다. delegateInstance.Invoke(arg1, arg2, ...) 형태로 사용하며, 여기서 arg1, arg2, ...는 델리게이트가 참조하는 메서드의 매개변수들이다..
이벤트 호출: 이벤트와 관련해서 Invoke() 메서드는 이벤트를 발생시킬 때 사용된다고 한다. 이벤트는 특정 액션이 발생했을 때 그것을 구독하는 모든 이벤트 핸들러(리스너)에 신호를 보내는 메커니이다.
이벤트를 발생시키기 위해, 이벤트에 연결된 델리게이트를 Invoke() 메서드를 통해 호출한다.
다음 포스팅에서 이벤트를 사용에 대해서 정리하고 대리자에 대해서 더 깊은 내용은 공부를 더 진행한 후 정리하겠다..