// 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) | 델리게이트를 기반으로, “특정 시점에 호출되도록” 만든 구조 |
'C#' 카테고리의 다른 글
| 과제 요구사항 분석 (0) | 2025.11.06 |
|---|---|
| 이벤트 핸들러 학습 후 응용한 예제 (0) | 2025.11.06 |
| 학생조회프로그램 - 외부클래스 분리버전 (0) | 2025.11.05 |
| "이벤트 핸들러"를 사용한 "인자 전달" (0) | 2025.11.05 |
| 인스턴스 (0) | 2025.11.05 |