using System.ComponentModel;
using System.Numerics;
using System.Threading;
using System.Collections.Generic;
namespace CSharp
{
class Program
{
delegate int OnClicked(); // 함수가 아니라 형식 -> 자체가 하나의 형식임
// delegate가 붙으면 -> 형식은 형식인데, 함수 자체를 인자로 넘겨주는 형식
// 반환은 int 입력 : void
// Onclicked delegate 형식의 이름이다.
// UI
static void ButtonPressed(/*함수 자체를 인자로 넘겨주고*/OnClicked clickedFunction)
{
//
//
//
// 여기 다 작성하면
// UI 코드와 게임 로직 코드가 꼬일 경우가 생김
// 현실적으로 안에 있는 코드를 수정하기 힘들 경우가 생김
// 함수를 호출
clickedFunction();
}
static int TestDelegate()
{
Console.WriteLine("Hello delegate");
return 0;
}
static int TestDelegate2()
{
Console.WriteLine("Hello delegate2");
return 0;
}
static void Main(string args)
{
// delegate 대리자
// 순차적으로 코드를 작성하고 실행했지만
// 그러지 않을 경우도 생김
// ex -> 사장님 비서 - 우리의 연락처 // 용건 거꾸로 -> 연락을 주세요
// ex -> UI
ButtonPressed(TestDelegate);
// 다양한 동작을 하는 하나의 함수를 만들때 유용함
// ex sorting 함수
// Delegate chaining
OnClicked clicked = new OnClicked(TestDelegate);
clicked += TestDelegate2;
}
}
}
Delegate는 함수를 저장하고 호출할 수 있는 특수한 객체입니다.
| 상황 | 문제점 |
|---|---|
| 특정 이벤트가 발생했을 때 실행할 함수가 정해져 있음 | 이벤트마다 함수를 하드코딩해야 함 |
| 버튼 클릭 시 다양한 동작 수행 | UI와 로직이 강하게 결합 |
| 함수 변경 시마다 이벤트 코드를 수정해야 함 | 유지보수 어려움 |
delegate int OnClicked();
OnClicked라는 대리자 타입 정의void)intclass Program
{
delegate int OnClicked(); // 대리자 선언
static int Test() // 대리자가 참조할 메서드
{
Console.WriteLine("Hello Delegate");
return 0;
}
static void Main()
{
OnClicked clicked = new OnClicked(Test); // 대리자 객체 생성 및 메서드 연결
clicked(); // 대리자 실행 = Test() 실행
}
}
| 단계 | 설명 |
|---|---|
| 1 | OnClicked라는 대리자 타입 정의 |
| 2 | Test() 메서드 작성 |
| 3 | clicked라는 대리자 객체 생성 & Test 연결 |
| 4 | clicked() 실행 = Test() 실행 |
clicked += Test2; // 추가 등록
clicked(); // 등록된 모든 함수 순차 실행
+= 로 여러 메서드 연결 가능-= 로 특정 메서드 삭제 가능static void ButtonPressed(OnClicked clickedFunction)
{
clickedFunction(); // 대리자 실행 = 등록된 함수 실행
}
| 기능 | 함수 포인터(C++) | Delegate(C#) |
|---|---|---|
| 타입 안전성 | 약함 | 강함 |
| 메서드 체이닝 | 불가능 | 가능 |
| 이벤트 연계 | 어렵다 | 매우 쉬움 |
| 다형성 지원 | 약함 | 강함 |
| 콜백 구현 | 가능 | 매우 편리 |
✅ 메서드 교체, 변경이 쉬움
✅ 이벤트 처리 유연
✅ 코드 결합도↓ (UI와 로직 분리)
✅ 체이닝으로 여러 동작 한번에 실행 가능
✅ 콜백 함수 구현 편리
🚨 등록된 함수가 없을 때 호출하면 NullReferenceException 발생 가능
OnClicked clicked = null;
clicked(); // 예외 발생!
✅ 호출 전 null 체크 필수
clicked?.Invoke();
class Program
{
delegate void SortMethod();
static void AscendingSort() { Console.WriteLine("오름차순 정렬"); }
static void DescendingSort() { Console.WriteLine("내림차순 정렬"); }
static void Sort(SortMethod sortMethod)
{
sortMethod();
}
static void Main()
{
string input = Console.ReadLine();
if (input == "1")
Sort(AscendingSort); // 오름차순 선택
else
Sort(DescendingSort); // 내림차순 선택
}
}
Sort 함수 수정 없음 → 확장성 높음delegate T SortMethod<T>(T[] array);
static void Sort<T>(T[] array, SortMethod<T> sortMethod)
{
sortMethod(array);
}