[C#] 대리자를 사용한 게시-구독 패턴

빵욱·2024년 1월 26일

C#_Event

목록 보기
5/7

이벤트를 사용하기전 대리자를 사용한 게시-구독에 대한 내용 정리.

대리자는 일단 멀티캐스트가 가능하다.
=> 여러개 메서드를 추가(+=)할 수 있다.

게시-구독 예제.

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); 이렇게 사용했다

inovke란?

Invoke() 메서드는 C#에서 델리게이트(delegate) 또는 이벤트를 호출하는 데 사용되는 방법 중 하나라고 한다.

Invoke() 메서드는 델리게이트가 참조하는 메서드를 실행하라는 명령을 내린다.

  • Invoke() 메서드의 역할

델리게이트 호출: 일반적으로 Invoke()는 델리게이트 인스턴스를 통해 연결된 메서드를 명시적으로 호출할 때 사용된다고 한다. delegateInstance.Invoke(arg1, arg2, ...) 형태로 사용하며, 여기서 arg1, arg2, ...는 델리게이트가 참조하는 메서드의 매개변수들이다..

이벤트 호출: 이벤트와 관련해서 Invoke() 메서드는 이벤트를 발생시킬 때 사용된다고 한다. 이벤트는 특정 액션이 발생했을 때 그것을 구독하는 모든 이벤트 핸들러(리스너)에 신호를 보내는 메커니이다.
이벤트를 발생시키기 위해, 이벤트에 연결된 델리게이트를 Invoke() 메서드를 통해 호출한다.

다음 포스팅에서 이벤트를 사용에 대해서 정리하고 대리자에 대해서 더 깊은 내용은 공부를 더 진행한 후 정리하겠다..

profile
rove drink eat

0개의 댓글