이벤트: 게시/구독, event 키워드
이벤트로 게시/구독을 구현합니다. event를 선언하고, 처리기를 추가·제거하며, EventArgs로 데이터를 전달하고 OnX 패턴으로 이벤트를 발생시킵니다.
이벤트: 게시/구독, 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 키워드의 역할
복습
복습: 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- delegate, Action/Func, 클로저
- 이벤트: 게시/구독, event 키워드
- 이벤트 패턴과 주의점(메모리 누수)