이벤트 생성/호출
< 이벤트란? >
이벤트(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/
C#.NET 0.5년차~3년차(파트1)
※ 블로그에 있는 모든 강의와 책의 내용은 저작권자(출판사/저자,공동저자)에게 직접 허락을 받아 작성되었습니다.