통계, IT, AI

C#에서 이벤트 사용하기 본문

IT/기타

C#에서 이벤트 사용하기

Harold_Finch 2017. 1. 29. 16:12

1. 들어가며

C#에서 UI를 개발하면서 이벤트가 무엇인지 고민하게 되었다. 즉, Visual Studio에서 이벤트 처리를 잘 지원하는 덕분에 아무 생각없이 해왔는데 좀 더 복잡한 것을 하려고 하니 이벤트를 잘 모른다는 것을 알게 된 것이다. 이번을 기회로 이벤트가 무엇인지 간단하게 정리하려고 한다. 


2. 이벤트의 개념

아래는 MSDN에 나오는 간단한 UI이다. 노란 패널에 무엇인가를 쓸 수 있고 Clear 버튼을 누르면 노란색 부분에 써져 있는 것이 지워진다. 이를 구현하기 위해서는 Clear 버튼이 눌리는 사건이 발생하면 그 정보를 패널에 전달해 주는 것이 필요한데, 그것이 이벤트이다.


그림 1. WPF Ink 응용 프로그램


즉, 이벤트는 한 클래스에서 어떤 사건이 발생하면 그 정보를 다른 클래스로 넘기는 방법이다. UI를 구성할 때 자주 등장하지만 반드시 UI에 얽매여 생각할 필요는 없다. 위의 Inkpad에서, 각 버튼과 패널도 클래스이기 때문이다. 


이벤트를 구성하기 위해서는 세가지 요건이 필요하다. 첫째는 사건이 발생하는 클래스에 그 정보를 밖으로 내보낼 수 있는 "문"이 있어야 한다는 것이다. 두번째는 그 문과 연결된 "길"이며 마지막으로 그 길의 "목적지"이다. C#에서 문은 이벤트 변수이며 길은 delegate 그리고 목적지는 그 이벤트의 정보를 받을 다른 클래스의 메소드이다. 아래의 그림을 보자.


그림 2. 이벤트 처리의 개념


클래스 A의 method가 실행되면서 D도 함께 실행된다. 이때 D는 method와 함께 선언된 이벤트 변수로 점선과 같이 클래스 외부에 정의된 delegate이다. 실행된 D는 그 정보를 delegate를 통해서 Class B로 전달한다. 단, Class A, Class B 그리고 delegate D는 모두 같은 namespace에 있어야 한다.


3. 간단한 예제

아래는 간단한 C# 코드이다. string을 인자로 받는 TestEvent delegate를 선언한다. 23번째 줄과 같이 TestEvent를 class A에 선언하여 class 외부로 통하는 문을 만들고 14번째 줄과 같이 문과 통로 그리고 목적지를 연결해준다. class A의 MakeSound method가 실행되면 class B의 NoticeSound도 함께 실행된다.

using System;

namespace EventExercise
{	
	public delegate void TestEvent(string str);
	
	class Program
	{
		static void Main(string[] args)
		{
			A a = new A();
			B b = new B();
			
			a.OccurEvent += new TestEvent(b.NoticeSound);
			
			a.MakeSound("\"Hi, there\"");
		}
		
	}
	
	class A
	{	
		public TestEvent OccurEvent;
		public void MakeSound(string sound)
		{
			Console.WriteLine("A said " + sound + ".");
			this.OccurEvent(sound);
		}
	}
	
	class B
	{
		public void NoticeSound(string sound)
		{
			Console.WriteLine("B noticed A say " + sound +".");
		}
	}
	
}


'IT > 기타' 카테고리의 다른 글

[python] mutable vs immutable  (0) 2017.11.28
[TensorFlow] 모델 저장 및 복원  (0) 2017.09.06
[기타] 티스토리 기초 설정  (1) 2017.07.09
C#에서 Zip 및 익명형식의 배열 사용하기  (0) 2016.11.14
C#과 R을 연동하기  (2) 2016.09.27
Comments