[Unity]/[C#]

[C#] delegate와 event의 차이

극꼼 2022. 5. 18. 13:10
반응형


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