C#/C#정리

[C#] Event - Delegate를 사용한 이벤트 처리

반나무 2021. 8. 31. 20:41

🌳 Event

  • 델리게이트를 이용한 콜백을 좀 더 기능적으로 만들어주는 키워드다.
  • 이벤트에서는 델리게이트 콜백에서 델리게이트 변수를 넘겨주었던 과정까지 생략할 수 있다.
  • 이벤트를 이해하려면 이벤트를 발생시키는 쪽과 발생한 이벤트에 반응하는 쪽을 나눠 생각할 수 있어야한다.
  • 이벤트를 발생시키는 클래스 : Publisher
  • 이벤트를 반응하는 클래스 : Subscriber

🌳 Event 사용이유

자식에서 부모의 메소드를 사용하는것은 매우 어려운 작업이다 아주 가부장적인 C#이다

그래서 이벤트를 통해 어디선가 작업된 내용을 쏘고 이벤트 구독을 통해 받는다.

이벤트는 구독자가 아주 많을 때 굉장히 유용하다.

이벤트 발생 후 구독자의 메서드를 일일이 호출해야 하는 것이 아니라, 각각의 구독자는

이 이벤트가 발생하는지 듣고 있다가 이벤트가 발생했을 때 자신이 등록해 놓은 메서드를 실행하기 때문이다.


🌳 Event 선언 순서

  1. 이벤트를 발생시키기 위한 이벤트 핸들러 델리게이트 선언
  2. 게시자 클래스 선언
  3. 이벤트 선언(참고로 이벤트 선언은 값을 전달하는 쪽에서 선언)
  4. 이벤트 게시자가 있는지 유무 체크
  5. 구독자 클래스 선언
  6. 이벤트 사용

🌳 기본 예시

public class EventExample
{
	// 4. 이벤트를 사용하는 예제
	void Main()
	{
		Subscriber sub = new Subscriber();
		Publisher pub = new Publisher();
		// Publisher가 이벤트를 실행하면 
		// 이벤트를 구독하고 있던 Subscriber의 메서드가 호출되는것을 확인할 수 있다.
		pub.RunEvent();
	}
}

// 1. Publisher 클래스 정의
delegate void myEventHandler();

class Publisher
{
	// static으로 생성해 Publisher의 객체와 무관한 이벤트로 만든다.
	public static event myEventHandler myEvent;
	
	// 2. 이벤트를 호출하는 메서드 생성
	public void RunEvent()
	{
		// 이 이벤트를 구독하는 클래스가 아무도없다면
		// myEvent를 호출할 때 NullReferenceException이 발생하므로
		// 이를 방지하기위해 if문으로 널 확인
		if(myEvent != null)
		{
			myEvent();
		}
	}
}

// 3. 이벤트를 구독하는 Subscriber 클래스 정의
class Subscriber
{
	public Subscriber()
	{
		Publisher.myEvent += DoSomething;
	}

	public void DoSomething()
	{
		Debug.Log("이벤트 발생!");
	}
}

예시 : 비트맵 → 비트맵이미지 → 바인딩

  1. 이벤트 핸들러 델리게이트 선언 + 3. 이벤트 선언
// 이벤트를 발생 시키기 위한 이벤트 핸들러 델리게이트 선언
public delegate void ImageCreated(BitmapImage bitmapImg);

// 이벤트 선언 ( 값을 전달 하는 쪽 )
public static event ImageCreated ImageCreatedEvent;

2. 게시자 클래스 선언 + 4. 이벤트 게시자가 있는지 유무 체크

// 비트맵을 받아서 비트맵 이미지로 변환 후 출력까지
public void PrintImage(Bitmap bitmap)
{
    // 이벤트 게시자가 있는지 유무 체크
    if (ImageCreatedEvent != null)
    {
        ImageCreatedEvent(bitmap2BitmapImage(bitmap));
    } else
    {
        throw new Exception(String.Format("이미지 출력 실패"));
    }
}

 

 

3. 구독자 클래스 선언 + 6. 이벤트 사용

public MainViewModel()
{
	CameraController.ImageCreatedEvent += PrintImage; 
}

private void PrintImage(BitmapImage bitmapImg)
{
    MainImage = bitmapImg;
}

 

[C#] C# 문법 이벤트(Event) 선언 및 사용 방법

이번 포스팅에서는 C# 문법 중 하나인 이벤트 선언하는 방법에 대해서 알아보도록 하겠습니다. 실무에서 프로젝트를 많이 하시다 보면 이벤트를 사용을 안 할래야 안 할 수가 없는 문법인데요.

afsdzvcx123.tistory.com

 

C# 이벤트 - C# 프로그래밍 배우기 (Learn C# Programming)

C# 이벤트 이벤트는 클래스내에 특정한 일(event)이 있어났음을 외부의 이벤트 가입자(subscriber)들에게 알려주는 기능을 한다. C#에서 이벤트는 event라는 키워드를 사용하여 표시하며, 클래스 내에

www.csharpstudy.com


도움이 되었다면 좋아요 꾹!

반응형