C#교과서 마스터하기 30. 이벤트(Event)

https://www.youtube.com/watch?v=C8xtvboY1gI&list=PLO56HZSjrPTB4NxAsEP8HRk6YKBDLbp7m&index=64

1. 이벤트(Event)

  • 특정 사황이 발생할 때 개체 또는 클래스에서 알림을 제공할 수 있도록 하는 멤버
    • 과속()
      • 사고 이벤트 발생
    • 운전()
      • 연료 부족 이벤트 발생

2. 프로젝트

01. 기본 이벤트 핸들러

  • Car.cs
using System;
using System.Collections.Generic;
using System.Text;

namespace Car
{
    // 이벤트 게시자(Publisher)
    class Car
    {
        private int _fuelGuage;
        public int FulGuage
        {
            get { return _fuelGuage;  }
            set { _fuelGuage = value; }
        }

        public Car()
        {
            FulGuage = 25; // 25%
        }
        public void Go()
        {
            Console.WriteLine("운전");
            FulGuage -= 5; // 5% 감소
        }

        public delegate void FuelEmputyNotification();
        public event FuelEmputyNotification FuelEmptyReached; // 연료부족 이벤트
        public void OnFuelEmptyReached()
        {
            if(FuelEmptyReached != null)
            {
                // FuelEmptyReached();
                FuelEmptyReached?.Invoke();
            }
        }

    }
}
  • Program.cs
using System;
using static System.Console;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace testProject
{
    // 이벤트 구독자(Subscriber)
    class Program
    {
        static void Main(string[] args)
        {
            Car.Car car = new Car.Car();
            car.FuelEmptyReached += Car_FuelEmptyReached; // += tab
            car.FuelEmptyReached -= Car_FuelEmptyReached; // 등록 취소
            // car.FuelEmptyReached += delegate () => { }; // 익명 함수
            car.FuelEmptyReached += () => {   // 람다 식
                Console.ForegroundColor = ConsoleColor.Red;
                Console.BackgroundColor = ConsoleColor.Black;
                WriteLine("연료부족");
                Console.ResetColor();
            }; 
            car.Go();
            car.OnFuelEmptyReached();
        }

        // 이벤트 핸들러(Evnet Handler)
        private static void Car_FuelEmptyReached() =>
            WriteLine("연료 부족");

    }
}

02. 이벤트 핸들러를 내부 코드에서 실행

  • Car.cs
using System;
using System.Collections.Generic;
using System.Text;

namespace Car
{
    // 이벤트 게시자(Publisher)
    class Car
    {
        private int _fuelGuage;
        public int FulGuage
        {
            get { return _fuelGuage;  }
            set 
            {
                _fuelGuage = value;
                OnFuelEmptyReached();
            }
        }

        public Car()
        {
            _fuelGuage = 25; // 25%
        }
        public void Go()
        {
            Console.WriteLine("운전");
            FulGuage -= 5; // 5% 감소
        }

        public delegate void FuelEmputyNotification();
        public event FuelEmputyNotification FuelEmptyReached; // 연료부족 이벤트
        public void OnFuelEmptyReached()
        {
            Console.WriteLine($"연료 상태 : {_fuelGuage}%");
            if(_fuelGuage < 20)
            {
                if (FuelEmptyReached != null)
                {
                    // FuelEmptyReached();
                    FuelEmptyReached?.Invoke();
                }
            }
            
        }

    }
}
  • Program.cs
using System;
using static System.Console;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace testProject
{
    // 이벤트 구독자(Subscriber)
    class Program
    {
        static void Main(string[] args)
        {
            Car.Car car = new Car.Car();
            car.FuelEmptyReached += Car_FuelEmptyReached; // += tab
            car.FuelEmptyReached -= Car_FuelEmptyReached; // 등록 취소
            // car.FuelEmptyReached += delegate () => { }; // 익명 함수
            car.FuelEmptyReached += () => {   // 람다 식
                Console.ForegroundColor = ConsoleColor.Red;
                Console.BackgroundColor = ConsoleColor.Black;
                WriteLine("연료부족");
                Console.ResetColor();
            }; 
            car.Go();
            // car.OnFuelEmptyReached();
            car.Go();
        }

        // 이벤트 핸들러(Evnet Handler)
        private static void Car_FuelEmptyReached() =>
            WriteLine("연료 부족");

    }
}


03. 대리자 간소화

  • Car.cs
using System;
using System.Collections.Generic;
using System.Text;

namespace Car
{
    // 이벤트 게시자(Publisher)
    class Car
    {
        private int _fuelGuage;
        public int FulGuage
        {
            get { return _fuelGuage;  }
            set 
            {
                _fuelGuage = value;
                OnFuelEmptyReached();
            }
        }

        public Car()
        {
            _fuelGuage = 25; // 25%
        }

        public void Go()
        {
            Console.WriteLine("운전");
            FulGuage -= 5; // 5% 감소
        }

        // 대리자
        // public delegate void FuelEmputyNotification();
        // public event FuelEmputyNotification FuelEmptyReached; // 연료부족 이벤트
        public event Action FuelEmptyReached; // 위 대리자와 동일한 기능
        public void OnFuelEmptyReached()
        {
            Console.WriteLine($"연료 상태 : {_fuelGuage}%");
            if(_fuelGuage < 20)
            {
                if (FuelEmptyReached != null)
                {
                    // FuelEmptyReached();
                    FuelEmptyReached?.Invoke();
                }
            }
            
        }

    }
}
  • Program.cs
using System;
using System.Collections.Generic;
using System.Text;

namespace Car
{
    // 이벤트 게시자(Publisher)
    class Car
    {
        private int _fuelGuage;
        public int FulGuage
        {
            get { return _fuelGuage;  }
            set 
            {
                _fuelGuage = value;
                OnFuelEmptyReached();
            }
        }

        public Car()
        {
            _fuelGuage = 25; // 25%
        }

        public void Go()
        {
            Console.WriteLine("운전");
            FulGuage -= 5; // 5% 감소
        }

        // 대리자
        // public delegate void FuelEmputyNotification();
        // public event FuelEmputyNotification FuelEmptyReached; // 연료부족 이벤트
        public event Action FuelEmptyReached; // 위 대리자와 동일한 기능
        public void OnFuelEmptyReached()
        {
            Console.WriteLine($"연료 상태 : {_fuelGuage}%");
            if(_fuelGuage < 20)
            {
                if (FuelEmptyReached != null)
                {
                    // FuelEmptyReached();
                    FuelEmptyReached?.Invoke();
                }
            }
            
        }

    }
}


좋은 웹페이지 즐겨찾기