강의 요약
1. Event는 Delegate를 감싸는 문법
2. Event 자체 호출 불가(Delegate는 가능함)
Event와 Delegate 차이점 한눈에 보기
| 구분 | delegate | event |
| 정체 | 함수 참조 타입 | delegate를 감싸는 문법 |
| 직접 호출 | ⭕ 가능 | ❌ 외부에서 불가 |
| 대입(=) | ⭕ 가능 | ❌ 불가 |
| 구독(+=) | ⭕ 가능 | ⭕ 가능 |
| 해제(-=) | ⭕ 가능 | ⭕ 가능 |
| 호출 위치 | 어디서나 가능 | 선언한 클래스 내부만 가능 |
| 목적 | 함수 포인터처럼 사용 | 이벤트 발생/구독 구조 |
| 안전성 | 낮음 (외부 제어 가능) | 높음 (캡슐화) |
| 사용 예 | 콜백, 전략 패턴 | UI 이벤트, 알림 시스템 |
언제 delegate를 쓰고, 언제 event를 써야 할까?
delegate를 쓰는 경우
- 함수 자체를 인자로 전달하고 싶을 때
- 전략 패턴, 콜백 구조
- 호출 주체를 제한할 필요가 없을 때
event를 쓰는 경우
- 외부 객체가 "구독"만 하도록 제한하고 싶을 때
- 이벤트 발생 책임을 명확히 하고 싶을 때
- UI, 옵저버 패턴, 알림 시스템
핵심 요약
- delegate는 함수 참조 그 자체
- event는 delegate를 감싸서 호출을 제한한 구조
- 외부에서 호출을 막고 싶다면 event를 사용
전체 코드
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Rookiss_CSharp
{
// https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part1?srsltid=AfmBOopkXVxKs-MQPYZkTjEYW-yIDMO5xP7l5hQq0hQasUWhobvyKO6N
// 58강 이벤트(Event)
/*
static void Main(string[] args)
{
OnClicked clicked = new OnClicked(TestDelegate);
clicked += TestDelegate2;
ButtonPressed(clicked);
// 델리게이트 문제점 : 위에서 델리게이트를 만든 다음 아래에서도 마음대로 호출가능
// 델리게이트는 아무나 호출가능해서 문제가 발생함
// 중요한 부분이라면 문제가됨
clicked();
}
*/
class Program
{
static void OnInputTest()
{
Console.WriteLine("Input Received");
}
static void Main(string[] args)
{
InputManager inputManager = new InputManager();
// 이벤트에 함수를 연결
inputManager.InuptKey += OnInputTest;
// 델리게이트와 이벤트 가장 큰 차이점
// 델리게이트와 다르게 이벤트는 자체 호출 불가능(멋대로 호출불가)
// 델리게이트로 하면 InuptKey 자체 호출 가능하지만, 이벤트로 할시 InuptKey 자체 호출 불가능
// inputManager.InuptKey(); // 에러남
// 그외 내부적으로는 큰 차이 없음, 둘다 콜백 방식임
// 즉, 이벤트로 할 수 있는 것은 함수을 연결 하거나 연결 해제만 가능
// inputManager.InuptKey += OnInputTest; // 연결
// inputManager.InuptKey -= OnInputTest; // 연결 해제
while (true)
{
inputManager.Update();
}
}
}
}
InputManager.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Rookiss_CSharp
{
// 구독자를 모집한다음, 특정 이벤트가 발생했을시 구독자에게 메시지를 보내는 방식인
// 디자인 패턴 중 옵저버 패턴에 해당됨
// 사용자의 입력을 캐치하서 다른 게임로직, 프로그램에 알려줌
// 중간매개 역할을 함
// Observer Pattern
class InputManager
{
public delegate void OnInputKey();
// 이렇게 바로 해도 되지만 밑에 처림 event를 붙여보기
// public OnInputKey InuptKey;
// 델리게이트로 하면 외부에서 호출 가능하는 문제로
// 한번 더 래핑한 event라는 것이 있음(이벤트로 하면 구독신청은 가능하지만, 외부에서 멋대로 호출 불가)
public event OnInputKey InuptKey; // 외부에서 사용할 수 있는 것은 대문자를 붙이기(강사님 스타일)
// InputKey랑 delegate랑 동일하게 한정자를 붙여줘야 한다.
public void Update()
{
// 사용자가 키를 누르지 않았다면
if (Console.KeyAvailable == false)
return;
// 입력키 정보를 읽어들임
ConsoleKeyInfo info = Console.ReadKey();
if (info.Key == ConsoleKey.A) // A키를 입력하였다면
{
// 모두한테 알려준다.
// 여기에 바로 코드를 넣는것은, 의존성을 증가시시키에 안 좋음
// 이때 사용하는 것이 콜백
// 유튜브랑 비슷함, 관심있으면 구독해서 새로운 영상 올라오면 메시지 알림 오는 것처럼
// 함수 등록을 해주면 받아볼 수 있음
InuptKey();
}
}
}
}
출처
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문| Rookiss - 인프런 강
현재 평점 4.9점 수강생 6,987명인 강의를 만나보세요. 기초 프로그래밍 지식이 없는 사람들을 위한 C# 프로그래밍 기초 강의입니다. 문법 암기 위주의 수업이 아니라, 최대한 필요한 부분만을 요
www.inflearn.com
58강 Event(이벤트)
'C# > 기본 문법' 카테고리의 다른 글
| C# Exception(예외처리) (0) | 2025.12.14 |
|---|---|
| C# lambda(람다) (0) | 2025.12.14 |
| C# Delegate(대리자) (0) | 2025.12.14 |
| C# Property(프로퍼티) (0) | 2025.12.14 |
| C# Interface(인터페이스) (0) | 2025.12.14 |