C# Academy · 강의

이벤트: 게시/구독, event 키워드

이벤트로 게시/구독을 구현합니다. event를 선언하고, 처리기를 추가·제거하며, EventArgs로 데이터를 전달하고 OnX 패턴으로 이벤트를 발생시킵니다.

레슨 2/38개 단계

이벤트: 게시/구독, event 키워드은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 3개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 3개의 강의가 포함되어 있습니다.

이벤트 개요

목표: 이벤트로 게시 및 구독을 구현합니다.

  • 게시자에 event를 선언합니다.
  • +=로 구독하고 -=로 구독을 해지합니다.
  • 게시자에서 안전하게 이벤트를 발생시킵니다.
  • EventArgs를 사용하여 데이터를 전달합니다.

기본 이벤트 사용

event를 노출하고 수신기가 연결하거나 분리하도록 하십시오. 이벤트를 호출할 수 있는 것은 게시자뿐입니다.

using System;

public class Button
{
  public event EventHandler Click;

  public void SimulateClick()
  {
    // Safe raise: copy then invoke if not null (C# 6-safe)
    EventHandler h = Click;
    if (h != null) h(this, EventArgs.Empty);
  }
}

public class Program
{
  static void OnClick(object sender, EventArgs e)
  {
    Console.WriteLine("Clicked!");
  }

  public static void Main(string[] args)
  {
    Button b = new Button();
    b.Click += OnClick;    // subscribe
    b.SimulateClick();     // prints "Clicked!"

    b.Click -= OnClick;    // unsubscribe
    b.SimulateClick();     // no output
  }
}

데이터를 포함한 이벤트

EventArgs(또는 EventHandler<TEventArgs>)를 사용하여 구독자에게 유용한 데이터를 전달하십시오.

using System;

// Data for the event
public sealed class PriceChangedEventArgs : EventArgs
{
  public decimal OldPrice { get; private set; }
  public decimal NewPrice { get; private set; }
  public PriceChangedEventArgs(decimal oldP, decimal newP)
  {
    OldPrice = oldP; NewPrice = newP;
  }
}

public sealed class Product
{
  private decimal _price;
  public event EventHandler<PriceChangedEventArgs> PriceChanged;

  public decimal Price
  {
    get { return _price; }
    set
    {
      if (value != _price)
      {
        decimal old = _price;
        _price = value;
        EventHandler<PriceChangedEventArgs> h = PriceChanged;
        if (h != null) h(this, new PriceChangedEventArgs(old, _price));
      }
    }
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Product p = new Product();
    p.PriceChanged += delegate(object s, PriceChangedEventArgs e)
    {
      Console.WriteLine("Price: " + e.OldPrice + " -> " + e.NewPrice);
    };
    p.Price = 10m;
    p.Price = 12m;
  }
}

다중 캐스트 및 람다

이벤트는 다중 캐스트입니다. 여러 처리기가 구독한 순서대로 실행됩니다. 이름이 지정된 처리기나 익명 처리기를 사용하십시오.

using System;

public class Alarm
{
  public event EventHandler Ring;

  public void Trigger()
  {
    EventHandler h = Ring;
    if (h != null) h(this, EventArgs.Empty);
  }
}

public class Program
{
  static void HandlerA(object s, EventArgs e) { Console.WriteLine("A"); }
  static void HandlerB(object s, EventArgs e) { Console.WriteLine("B"); }

  public static void Main(string[] args)
  {
    Alarm a = new Alarm();
    a.Ring += HandlerA;                           // named
    a.Ring += delegate(object s, EventArgs e) { Console.WriteLine("lambda"); }; // anon
    a.Ring += HandlerB;

    a.Trigger(); // prints A, lambda, B (multicast order)
  }
}

OnX 발생 패턴

보호된 OnX 메서드를 사용하여 이벤트를 발생시키십시오. 대리자를 지역 변수에 복사한 다음 호출하기 전에 null인지 확인하십시오.

using System;

public class Ticker
{
  public event EventHandler Tick;

  protected virtual void OnTick()
  {
    EventHandler h = Tick;          // copy to local
    if (h != null) h(this, EventArgs.Empty);
  }

  public void RunOnce()
  {
    // do work...
    OnTick(); // raise via protected method
  }
}

public class Program
{
  static void Show(object s, EventArgs e) { Console.WriteLine("Tick!"); }

  public static void Main(string[] args)
  {
    Ticker t = new Ticker();
    t.Tick += Show;
    t.RunOnce();
  }
}

이벤트 팁 및 주의점

팁:

  • 구독자가 더 이상 필요하지 않으면 항상 구독을 해지하십시오( -= ).
  • 처리기는 짧게 유지하고, 오래 걸리는 작업은 대기열에 넣어야 합니다.
  • EventArgs(또는 그 하위 클래스)를 사용하여 데이터를 전달하십시오.
  • 이벤트를 발생시켜야 하는 것은 게시자뿐입니다.

event 키워드의 역할

간단한 확인: 구독과 구독 해지를 위해 대리자를 노출하면서 외부 코드가 대리자를 직접 호출하지 못하게 하는 C# 키워드는 무엇입니까?

복습

복습: event를 선언하고, 수신기가 연결하거나 분리하도록 하며, EventArgs로 데이터를 전달하고, 보호된 OnX 메서드를 통해 이벤트를 발생시키십시오.

무료로 시작

AI 튜터와 함께 C#을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
93
레슨
346

자주 묻는 질문

“이벤트: 게시/구독, event 키워드” 강의는 무료인가요?

네 — “이벤트: 게시/구독, event 키워드” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 3개의 강의가 포함되어 있습니다.

“이벤트: 게시/구독, event 키워드”에서 뭘 배우나요?

이벤트로 게시/구독을 구현합니다. event를 선언하고, 처리기를 추가·제거하며, EventArgs로 데이터를 전달하고 OnX 패턴으로 이벤트를 발생시킵니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 3개 중 2번째 강의입니다.

“이벤트: 게시/구독, event 키워드” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. delegate, Action/Func, 클로저
  2. 이벤트: 게시/구독, event 키워드
  3. 이벤트 패턴과 주의점(메모리 누수)
← C# Academy(으)로 돌아가기