C#

이벤트 핸들러 학습 예제

joo_coding 2025. 11. 6. 10:49

 

// Create.cs
public Action<string> TempAction;  

string recivedData = "사과";

public void TriggerAction()
{
    TempAction?.Invoke(recivedData);
}
// Form1.cs
private Create create = new Create();

public Form1()
{
    InitializeComponent();

    create.TempAction += ReadData;
}

private void button2_Click(object sender, EventArgs e)
{
    create.TriggerAction();
}

private void ReadData(string obj)
{
    MessageBox.Show($"Action 호출됨: {obj}");
}

 

>> TempAction? 조건은 “현재 구독자가 등록되어 있느냐”를 확인하는 것이고,
create.TempAction += ReadData; 덕분에 TempAction이 null이 아니게 되어,

TriggerAction()이 실행될 때 ReadData()가 호출됨

 

< 흐름 >

1. Form1이 Create 클래스의 인스턴스 create 를 생성한다.

2. Form1의 ReadData 메서드를 create.TempAction을 구독한다.

3. UI 이벤트가 발생하면, create.TriggerAction이 호출된다.

4. TriggerAction이 TempAction?.Invoke(recivedData); 을 실행한다.

5. TempAction의 구독자가 있다면 이벤트를 일으키고, recivedData를 넘겨준다.

6. 구독자는 ReadData 이므로 자신 메서드를 실행한다.

 

이벤트 발행자 (Publisher) Create 클래스 이벤트를 정의하고 발생시키는 쪽
이벤트 구독자 (Subscriber) Form1 클래스 이벤트를 감지하고 반응하는 쪽
이벤트 핸들러 (Event Handler) ReadData() 이벤트가 발생했을 때 실행될 메서드
델리게이트 (Delegate) Action<string> 핸들러를 저장하고 실행할 수 있는 변수
이벤트 발생(Event Invoke) TempAction?.Invoke(recivedData) 실제로 델리게이트를 통해 핸들러 실행

 

< 개념 요약 >

개념  역할
Action<string> 델리게이트(“메서드 포인터”)
TempAction 이벤트를 담는 필드
+= ReadData 이벤트 구독 (핸들러 등록)
?.Invoke(...) 이벤트 호출 (발행자 → 구독자 통보)
string obj 전달되는 데이터
ReadData() 이벤트가 호출될 때 실행되는 메서드 = 이벤트 핸들러

< Delegate >

메서드를 변수처럼 저장하고 전달할 수 있게 해주는 타입 = 메서드 주소를 담는 포인터

나중에 메서드를 대신 호출하려고 사용하는 변수

 

델리게이트(delegate) 메서드를 대신 실행할 수 있는 “메서드 참조 변수”
Invoke() 델리게이트가 가리키는 메서드 실행
+= / -= 델리게이트에 메서드 추가 / 제거
이벤트(event) 델리게이트를 기반으로, “특정 시점에 호출되도록” 만든 구조