이벤트(Event)
이벤트(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" 등의 검색어를 통해서 검색되는 아티클 등을 참고해 보시면 좋습니다.