C#

이벤트 생성/호출

윤태영(Coding) 2023. 6. 15. 21:34

< 이벤트란? >

이벤트(event)는 어떤 사건이 발생했을 때 통보를 받고 해당 사건에 대응하여 처리를 수행하는 프로그래밍 패턴이다. 예를 들어, 버튼 클릭, 키 입력, 타이머 만료 등과 같은 상황을 이벤트라고 할 수 있다. 이벤트는 특정 사건이 발생했을 때 델리게이트를 통해 해당 사건을 처리하는 메서드를 호출한다.

< 이벤트 생성하기 >

이벤트를 사용하기 위해서는 먼저 이벤트를 정의해야 한다.

이벤트를 정의할 때는 event 키워드를 사용한다.

public delegate void MyEventHandler(string message); // 델리게이트 정의
public event MyEventHandler MyEvent; // 이벤트 정의


< 이벤트 구독 및 처리하기 >

이벤트가 발생했을 때 실행할 메서드를 작성하고, 이 메서드를 이벤트에 연결한다. 이를 이벤트 구독(subscription)이라고 한다.

아래의 Form1과 Form2 코드가 있다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            form2.Show();
            form2.OnCount += MyCount;
        }

        int c = 0;

        //자식클래스가 보낸데이터 수신(구독)
        public void MyCount(int myCount)
        {
            c += myCount;
            label1.Text = c.ToString();
        }
        
    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form2 : Form
    {
        public delegate void CountHandler(int addCount);
        public event CountHandler OnCount;

        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //이 예제에서 매개변수로 int를 전달하지만.
            //개발자가 만든Class의 객체,string도 가능
            OnCount(1);
        }
    }
}

 

[Form2 (이벤트 생성자)]

먼저 Form2에서는 델리게이트를 정의한다. 이 델리게이트는 int형 매개변수를 받는 메서드를 참조한다.

델리게이트를 사용하여 이벤트를 정의한다. 이 이벤트는 Form2의 버튼이 클릭될 때 발생시킬 것이다.

public delegate void CountHandler(int addCount);

 

button1_Click 메서드에서는 이벤트를 발생시킨다. 이 예제에서는 1이라는 값을 매개변수로 전달한다.

public event CountHandler OnCount;

[Form1 (이벤트 구독자)]
Form1에서는 Form2의 인스턴스를 생성하고, Form2의 OnCount 이벤트에 대한 구독을 설정한다. 이때 Form1 내의 MyCount 메서드가 구독자로 동작한다.

private void button1_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2();
    form2.Show();
    form2.OnCount += MyCount;
}

 

MyCount 메서드는 Form2로부터 받은 값을 c에 더하고, 이를 레이블에 표시한다. 이 메서드는 Form2의 OnCount 이벤트에 의해 호출된다.

int c = 0;

public void MyCount(int myCount)
{
    c += myCount;
    label1.Text = c.ToString();
}

 

 

이렇게 Form2에서 발생한 이벤트가 Form1에서 처리된다. Form2의 버튼을 클릭할 때마다 Form1의 레이블에 표시되는 값이 증가한다. 이벤트를 사용함으로써 두 폼 사이에 느슨한 결합(loose coupling)을 유지할 수 있고, 코드의 유지 보수가 용이해진다.


Reference : https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/events/

 

Events - C# Programming Guide

Learn about events. Events enable a class or object to notify other classes or objects when something of interest occurs.

learn.microsoft.com

C#.NET 0.5년차~3년차(파트1)

※ 블로그에 있는 모든 강의와 책의 내용은 저작권자(출판사/저자,공동저자)에게 직접 허락을 받아 작성되었습니다.

https://www.inflearn.com/course/lecture?courseSlug=%EB%8B%B7%EB%84%B7-%EC%9C%88%ED%8F%BC-1&unitId=77892&tab=curriculum 

 

학습 페이지

 

www.inflearn.com