본문 바로가기

C#/기본 문법

C# Event(이벤트)

강의 요약

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();
            }
        }

    }
}

 

 

 

 

 


 

 

 

출처


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

 

[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