이벤트(Event)

  • 9 minutes to read

이벤트(event)는 특정 상황이 발생할 때 개체 또는 클래스에서 알림(Notification)을 제공할 수 있도록 하는 멤버로, 버튼 클릭과 마우스 오버와 같은 이벤트 기반 프로그래밍에 사용되는 개념입니다. 콘솔 응용 프로그램이 아닌 데스크톱 및 웹 프로그래밍에서는 자주 사용됩니다. event 키워드를 사용하는 이벤트 개념에 대해서는 짧게 정리하고 넘어가겠습니다.

> // 이벤트: 특정 상황이 발생할 때 개체 또는 클래스에서 알림을 제공할 수 있도록 하는 멤버

이벤트

C#에서 event 키워드를 사용하여 만드는 이벤트를 쉽게 설명하기에는 어려움이 많습니다. 이벤트는 사건 및 사고의 의미를 갖지만 프로그래밍에서는 특정 메서드가 실행되는 결과라는 의미가 큽니다. 다음은 이벤트에 대한 내용이니 한 번 정도 가볍게 읽고 넘어가면 됩니다.

  • 이벤트는 개체의 메서드 실행 결과(사고)를 나타냅니다.
  • 자동차 개체를 예로 들면 과속이라는 동작(메서드)의 수행 결과는 교통 사고라는 이벤트(사고)가 발생한다는 의미로 이벤트를 해석할 수 있습니다.
  • 웹 응용 프로그래밍 및 데스크톱 응용 프로그램은 이벤트 기반 프로그래밍이라 할 정도로 많은 이벤트를 사용합니다. 버튼 클릭과 마우스 오버 등이 대표적인 이벤트입니다.
  • 마우스 클릭 이벤트, 마우스 오버 이벤트, 마우스 아웃 이벤트 등을 표현하고자 할 때는 이벤트 기능으로 정의합니다.

참고: 클래스부터 이벤트까지의 내용을 자동차로 비유

자동차 설계도(클래스)로부터 하나의 빨간색 스포츠카(속성) 자동차(개체)를 만들어서, 시동을 걸고(생성자) 전진 및 좌회전(메서드)을 하면서, 가끔은 대리 운전(대리자)도 부르고, 그러다가 과속(메서드)을 해서 이 결과 교통사고(이벤트)가 발생해서, 그나마 멀쩡한 카오디오(필드)는 중고로 팔고, 폐차(소멸자)했습니다.

이벤트와 이벤트 핸들러

프로그래밍에서 이벤트(Event)와 이벤트 처리기(Event Handler)는 다음과 같이 표현합니다.

  • 이벤트: 클릭과 마우스 오버와 같은 동작(트리거)
  • 이벤트 처리기: 특정 이벤트를 담당하기 위해 만들어진 메서드

C# 콘솔 응용 프로그램에서 이벤트는 특정 조건이나 동작이 발생할 때 트리거되는 알림 메커니즘이며, 이벤트 핸들러는 이 이벤트가 발생했을 때 실행될 메서드를 정의합니다. 이벤트 핸들러 메서드는 Sender, EventArgs와 같은 이름의 매개 변수를 받기도 합니다.

이벤트, 대리자, 이벤트 핸들러

다음 코드는 btnClick 이름의 버튼 개체의 Click 이벤트에 EventHandler 대리자를 사용하여 코드 실행 파이프라인에 btnClick_Click 이름의 이벤트 핸들러를 등록하는 코드 조각입니다.

this.btnClick.Click += new System.EventHandler(this.btnClick_Click); 

이벤트와 대리자를 통한 메서드 등록 및 호출

대리자는 이벤트를 위한 중간 단계라고 보고 이벤트는 여러 개의 메서드, 특히 이벤트 처리 전용 메서드라 불리는 이벤트 처리기(핸들러) 메서드를 등록 후 실행시키는 역할을 하며 주로 운영체제 레벨에서 마우스 및 키보드와 같은 장치와 같이 연동될 때 사용되는 프로그램 구조입니다. 일반적인 프로그래밍 환경에서는 많이 사용되지 않을 듯하나, 컨트롤 및 컴포넌트 제작 분야로 깊이 들어가다 보면 이벤트를 작성하는 일을 빈번할 것입니다.

이번에는 이벤트를 직접 코드로 만들어보겠습니다.

코드: EventDemo.cs

using System;

public class ButtonClass
{
    //[1] 이벤트 생성을 위한 대리자 하나 생성
    public delegate void EventHandler(); // 여러 개 메서드 등록 후 호출 가능

    //[2] 이벤트 선언: Click 이벤트 
    public event EventHandler Click;

    //[3] 이벤트 발생 메서드: OnClick 이벤트 처리기(핸들러) 생성
    public void OnClick()
    {
        if (Click != null) // 이벤트에 등록된 값이 있는지 확인(생략 가능)
        {
            Click(); // 대리자 형식의 이벤트 수행
        }
    }
}

class EventDemo
{
    static void Main()
    {
        //[A] Button 클래스의 인스턴스 생성
        ButtonClass btn = new ButtonClass();

        //[B] btn 개체의 Click 이벤트에 실행할 메서드들 등록
        btn.Click += Hi1; // btn.Click += new ButtonClass.EventHandler(Hi1);
        btn.Click += Hi2; // btn.Click += new ButtonClass.EventHandler(Hi2);

        //[C] 이벤트 처리기(발생 메서드)를 통한 이벤트 발생: 다중 메서드 호출
        btn.OnClick();
    }
    static void Hi1() => Console.WriteLine("C#");
    static void Hi2() => Console.WriteLine(".NET");
}
C#
.NET

[1]번 코드에서는 EventHandler란 이름의 대리자를 만들었습니다. 대리자 이름은 무엇을 사용하던 상관없습니다. [2]번 코드에서는 Click이라는 이름의 이벤트를 만드는 과정인데 event 키워드와 대리자 형식을 함께 사용하여 Click을 이벤트로 정의하였습니다. [3]번 코드는 Click 이벤트에 등록된 메서드가 있다면 이를 호출할 때 사용하는 OnClick 이름의 이벤트 처리기를 만드는 모양입니다. 이와 같이 대리자, 이벤트, 이벤트 처리기를 하나의 쌍으로 ButtonClass 클래스에 구현하였습니다. [A]에서 ButtonClass의 인스턴스를 생성 후 [B] 코드에서처럼 Click 이벤트에 += 연산자를 사용하여 하나 이상의 대신 호출할 메서드를 등록할 수 있습니다. 이렇게 등록된 메서드는 [C] 코드 영역에서처럼 OnClick() 메서드를 통해서 이벤트에 등록된 하나 이상의 메서드를 호출할 수 있습니다. 콘솔 응용 프로그램에서는 따로 이벤트를 구현할 필요는 거의 없습니다. 대신에 Windows Forms 또는 Web Forms와 같은 프로그래밍 환경에서는 이러한 이벤트들이 이미 구현되어 있어 자주 사용하게 됩니다.

장 요약

이번 강의는 이 강의(책)에서 가장 짧은 장입니다. 이벤트를 직접 구현하여 프로그래밍을 하는 분야에 대해서는 이 책의 학습 범위를 벗어납니다. 그러기에 하나의 예제만을 만들어 보고 이 장을 마무리하겠습니다. C#의 이벤트에 좀 더 궁금한 내용이 있는 독자라면 검색 엔진에서 "C# event" 등의 검색어를 통해서 검색되는 아티클 등을 참고해 보시면 좋습니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com