C# event

C#์—์„œ Event์™€ EventArgs๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์ง€๋งŒ ๊ทธ ์—ญํ• ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

1. Event (์ด๋ฒคํŠธ)

  • ์ •์˜: Event๋Š” ๊ฐ์ฒด ๊ฐ„์˜ ํ†ต์‹ ์„ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์—ญํ• : ํŠน์ • ๋™์ž‘(์˜ˆ: ๋ฒ„ํŠผ ํด๋ฆญ, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋“ฑ)์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๊ตฌ๋…์ž(Subscriber) ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ํ˜•ํƒœ: event ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด๋ฒคํŠธ๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ:

using System;

public class Publisher
{
    // ์ด๋ฒคํŠธ ์„ ์–ธ
    public event EventHandler MyEvent;

    public void RaiseEvent()
    {
        Console.WriteLine("์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.");
        MyEvent?.Invoke(this, EventArgs.Empty); // ์ด๋ฒคํŠธ ๋ฐœ์ƒ
    }
}

public class Subscriber
{
    public void HandleEvent(object sender, EventArgs e)
    {
        Console.WriteLine("์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค.");
    }
}

class Program
{
    static void Main()
    {
        Publisher pub = new Publisher();
        Subscriber sub = new Subscriber();

        // ์ด๋ฒคํŠธ ๊ตฌ๋…
        pub.MyEvent += sub.HandleEvent;

        pub.RaiseEvent(); // ์ด๋ฒคํŠธ ๋ฐœ์ƒ
    }
}

์ถœ๋ ฅ:

์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค.

2. EventArgs

  • ์ •์˜: EventArgs๋Š” ์ด๋ฒคํŠธ์— ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
  • ์—ญํ• : ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์— ์ถ”๊ฐ€ ์ •๋ณด(๋ฐ์ดํ„ฐ)๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด๋ฒคํŠธ์— ์ „๋‹ฌํ•  ์ •๋ณด๊ฐ€ ์—†๋‹ค๋ฉด EventArgs.Empty๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ™•์žฅ: ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ EventArgs๋ฅผ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ EventArgs ์˜ˆ์‹œ:

using System;

public class MyEventArgs : EventArgs
{
    public string Message { get; }

    public MyEventArgs(string message)
    {
        Message = message;
    }
}

public class Publisher
{
    public event EventHandler<MyEventArgs> MyCustomEvent;

    public void RaiseEvent()
    {
        Console.WriteLine("์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.");
        MyCustomEvent?.Invoke(this, new MyEventArgs("์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ"));
    }
}

public class Subscriber
{
    public void HandleEvent(object sender, MyEventArgs e)
    {
        Console.WriteLine($"์ด๋ฒคํŠธ ์ˆ˜์‹ : {e.Message}");
    }
}

class Program
{
    static void Main()
    {
        Publisher pub = new Publisher();
        Subscriber sub = new Subscriber();

        // ์ด๋ฒคํŠธ ๊ตฌ๋…
        pub.MyCustomEvent += sub.HandleEvent;

        pub.RaiseEvent(); // ์ด๋ฒคํŠธ ๋ฐœ์ƒ
    }
}

์ถœ๋ ฅ:

์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
์ด๋ฒคํŠธ ์ˆ˜์‹ : ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

์ฐจ์ด์  ์š”์•ฝ

| ๊ตฌ๋ถ„ | Event (์ด๋ฒคํŠธ) | EventArgs | |โ€”โ€”โ€”โ€”โ€”โ€“|โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”|โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”-| | ์—ญํ•  | ์ด๋ฒคํŠธ๋ฅผ ์ •์˜ํ•˜๊ณ  ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜ | ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์— ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ๊ฐ์ฒด | | ์‚ฌ์šฉ๋ฒ• | event ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„ ์–ธ | ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์— EventArgs๋ฅผ ์ „๋‹ฌ | | ํ™•์žฅ์„ฑ | ํ™•์žฅ ๋ถˆ๊ฐ€๋Šฅ (์ด๋ฒคํŠธ ์ž์ฒด๋Š” ์ •์˜๋œ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ) | EventArgs๋ฅผ ์ƒ์†ํ•˜์—ฌ ์ปค์Šคํ…€ ๊ฐ€๋Šฅ | | ์˜ˆ์‹œ | public event EventHandler MyEvent; | public class MyEventArgs : EventArgs |


์ •๋ฆฌ

  • Event: ์ด๋ฒคํŠธ๋ฅผ ์„ ์–ธํ•˜๊ณ  ๊ตฌ๋…์ž์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต.
  • EventArgs: ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ์ปจํ…Œ์ด๋„ˆ.
    EventArgs๋ฅผ ํ™•์žฅํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.