1. delegate
2. event
3. delegate와 event의 차이점
1. delegate
: delegate는 하나의 형식(type)으로, 메서드에 대한 참조입니다. delegate는 인스턴스 메서드, 정적메서드 모두 참조 가능합니다. delegate는 값이 아닌 '코드' 자체를 넘기고 싶을 때 사용할 수 있고, 사용 예시는 아래와 같습니다.
delegate int Compare(int number1, int number2);
static int AscendCompare(int number1, int number2)
{
if (number1 > number2) return 1;
else if (number1 == number2) return 0;
else return -1;
}
static int DescendCompare(int number1, int number2)
{
if (number1 < number2) return 1;
else if (number1 == number2) return 0;
else return -1;
}
static void ExchangeData(ref int number1, ref int number2)
{
int Temporary=number1;
number1 = number2;
number2 = Temporary;
}
static void BubbleSort(int [] Data , Compare Comparer) //Compare로 숫자 비교
{
for (int j = 0; j < Data.Length; j++)
{
for (int i = 0; i < Data.Length - 1 - j; i++)
{
if (Comparer(Data[i], Data[i + 1]) > 0)
{
ExchangeData(ref Data[i], ref Data[i + 1]);
}
}
}
}
static void Main(string[] args)
{
int[] Data = new int[]{ 10, 5, 2, 9, 8, 1, 6, 3, 2, 5 };
BubbleSort(Data, AscendCompare); //사용할 정렬방식 선택 = AscendCompare
Console.WriteLine("==Sorted by Ascend==");
for (int i = 0; i<Data.Length; i++)
{
Console.Write(Data[i]);
}
Console.WriteLine(Environment.NewLine+"==Sorted by Descend==");
BubbleSort(Data, DescendCompare); //사용할 정렬방식 선택 = DescendCompare
for (int i = 0; i<Data.Length; i++)
{
Console.Write(Data[i]);
}
}
* 델리게이트 체인과 Anonymous Method Call(익명 메서드)
델리게이트 하나로 여러개의 메서드를 동시에 참조할 수 있는데요, 아래 코드와 같이 델리게이트를 여러개 등록하여 순서대로 호출합니다.
delegate void DelegateChain();
static void Print1()
{
Console.WriteLine("Welcome");
}
static void Print2()
{
Console.WriteLine("To");
}
static void Print3()
{
Console.WriteLine("C#");
}
static void Main(string[] args)
{
DelegateChain chaincall = new DelegateChain(Print1);
chaincall += Print2;
chaincall += Print3;
chaincall();
}
Anonymous Method Call(익명 메서드)는 델리게이트로 참조할 일회용 메서드를 참조할 때 사용합니다.
static void Main(string[] args)
{
DelegateChain chaincall = new DelegateChain(Print1);
chaincall += Print2;
chaincall += Print3;
chaincall -= Print2;
chaincall +=
delegate ()
{
Console.WriteLine("Anonymous Method call");
};
chaincall();
}
2. event
: 프로그래밍에 어떤 일이 생겼을 때 실행되는 객체입니다.
이벤트기반 프로그래밍(Event-driven programming)은 사용자가 명령하는 것에 대해서 프로그램이 그에 반응하는 것처럼 이벤트 기반으로 만들어진 프로그래밍 방식입니다.
이벤트는 delegate를 event 한정자로 수식해서 만듭니다. 사용 예시는 아래와 같습니다.
delegate void EventHandler(string message);
class Notifier
{
public event EventHandler EventHappened;
public void DoSomething(int number)
{
if (number == 5) // 숫자가 5일때 이벤트가 발생
{
EventHappened("이벤트 발생 : " + number.ToString());
}
}
}
static void MyHandler(string message)
{
Console.WriteLine(message);
}
static void Main(string[] args)
{
Notifier notifier = new Notifier();
notifier.EventHappened += MyHandler; // 발생시킬 이벤트를 등록
for (int i = 0; i < 10; i++)
{
notifier.DoSomething(i);
}
}
3. delegate와 event의 차이점
- 이벤트 = 델리게이트에 event를 수식해서 선언한 것.
- 둘의 가장 큰 차이점 : 이벤트는 인터페이스 내부에 선언할 수 있지만, 델리게이트는 선언할 수 없음.
이벤트는 public으로 선언되어 있어도, 자신이 선언되어 있는 클래스 외부에서 호출할 수 없습니다. 이는 이벤트 기반 프로그래밍에서 안정성을 추구하는 것으로, 클래스 외부에서 이벤트에 변화를 줄 수 없게 하기 위함입니다.
- 델리게이트 = 콜백 용도.
- 이벤트 = 객체의 상태 변화, 사건의 발생을 알리는 용도.
'[Unity] > [C#]' 카테고리의 다른 글
[C#] string 출력 방법(feat. Console.Write) (0) | 2022.06.02 |
---|---|
[C#] 오버라이딩과 오버로딩 (0) | 2022.05.22 |
[C#] 구조체(struct) (0) | 2022.05.16 |
[C#] 인터페이스 (0) | 2022.05.15 |
[C#] 메모리(+ 가비지) (0) | 2022.05.13 |