[C#] 델리게이트

Flaming Bun·2025년 4월 23일

C#

목록 보기
16/35

참고 영상 https://www.youtube.com/watch?v=0MhAFzZKaJk&list=PLVsNizTWUw7GN8wPRhclbKuQa9aI9Cj2V&index=14

🔥 델리게이트(Delegate)

1) 델리게이트란

  • 델리게이트는 메서드를 참조하는 타입이다.
  • 다른 프로그래밍 언어에서는 함수 포인터라는 용어를 사용하기도 한다.(함수 포인터와 동일한 개념은 아님)
  • 델리게이트를 이용하면 메서드를 매개변수로 전달하거나 변수에 할당할 수 있다.
  • 특정 시그니처를 가진 메서드를 대신 호출할 수 있는 대리자
  • 멀티캐스트를 지원해서 여러개의 메서드를 대리자에 등록해서 사용할 수 있다.
  • 대리자가 실행할 코드는 컴파일 시점이 아닌 실행 시점에 결정

⚔ 델리게이트 예시

delegate void MyDelegate(string message);

static void Method1(string message)
{
    Console.WriteLine("Method1: " + message);
}
static void Method2(string message)
{
    Console.WriteLine("Method2: " + message);
}

static void Main(string[] args)
{
    MyDelegate myDelegate = Method1;
    myDelegate += Method2;

    myDelegate("Hello!");
}

// 출력
>> Method1: Hello!
>> Method2: Hello!

2) 익명 메서드(Anonymous Method)

  • 다른 코드 블록에서 재사용될 일이 없는 이름 없는 메소드

  • 익명 메소드 구현 절차
    1. 사전 정의된 대리자의 시그니처(메서드 형식)에 맞춰 익명 메소드 작성
    2. 익명 메소드 정의시 delegate 키워드로 시작하고, 정의된 코드는 대리자 참조에 할당
    3. 익명 메소드를 할당받은 대리자 참조 호출

⚔ 익명 메서드 예시

delegate int Calculator(int a, int b);

public static void Main()
{
	Calculator calculator;
    // 1. 익명 메서드 작성, 2. 대리자 참조에 할당
    calculator = delegate(int a, int b)
    			{
    				return a+b;
    			};
	// 3. 대리자 참조 호출
    Console.WriteLine("5+4 : {0}", calculator(5,4)); 
}

// 출력
>> 5+4 : 9

3) 이벤트(Event)

  • C#에서 객체의 사건을 표현하는 형식
  • 이벤트 처리기(Event Handler): 이벤트 발생 시 실행되는 메소드
  • 동작 원리는 대리자와 유사하다.
  • 객체의 은닉성 표현을 위해서 이벤트는 외부에서 직접 “호출” 할 수 없다.
  • 대리자를 event 한정자로 수식하여 선언

⚔ 이벤트와 이벤트 처리기 예시

// 1. 대리자 선언
delegate void EventHandler(string message);

// 2. 대리자 인스턴스를 event 한정자로 수식
class Messenger
{
    public event EventHandler SomethingHappened; // 참조 선언
    public void DoSomething(int number)
    {
        int temp = number % 10;
        if (temp != 0 && temp % 3 == 0)
        {
            SomethingHappened(String.Format("{0} : 짝", number));
        }
    }
}

class MainApp
{
    // 3. 이벤트 처리기 작성
    static public void MyHandler(string message)
    {
        Console.WriteLine(message);
    }
    
    //4. 클래스의 인스턴스 생성 및 해당 인스턴스의 이벤트에 처리기 등록
    static void Main(string[] args)
    {
        Messenger messenger = new Messenger();
        // 이벤트 						// 대리자	// 이벤트 처리기
        messenger.SomethingHappened += new EventHandler(MyHandler);
        for (int i = 1; i < 30; i++)
        {
            messenger.DoSomething(i);
        }
    }
}

4) 람다식(Lambda Expression)

  • (매개변수 목록) => { ... };꼴로 이루어진 식이다.

  • 람다식으로 무명함수 정의하기
    무명함수(Anonymous Function)는 람다식으로 만드는 익명 메서드다.
    무명함수를 작성하기 위해서는 먼저 대리자로 무명함수의 모습을 결정한다.

⚔ 무명함수 예시

delegate int Calculator(int a, int b);

static void Main(string[] args)
{
	// Calculator calculator = (int a, int b) => a + b;
                 // 데이터 형식 생략 가능
    Calculator calculator = (a,b) => a+b;
    Console.WriteLine( calculator(1, 2) );
}

⚔ 무명함수 문 형식 예시
문 형식으로 작성할 때는 ()=> { } 처럼 실행할 코드를 코드 블럭으로 감싼다.

delegate void DoSomething();
// ...
static void Main(string[] args)
{
	// 문 형식
    DoSomething doSomething = () =>
    {
        Console.WriteLine(“Something”);
    }
}

0개의 댓글