22 delegate 기초

vencott·2021년 6월 2일
0

C#

목록 보기
22/32

메서드의 파라미터로 데이터(기본 타입이나 객체)가 아닌 메서드를 전달

Delegate는 이렇게 메서드를 다른 메서드로 전달할 수 있도록 하기 위해 만들어졌다

메서드의 입력 파라미터로 피호출자에게 전달될 수 있을 뿐만 아니라 메서드의 리턴값으로 호출자에게 전달될 수도 있다

// 정의
delegate int MyDelegate(string s);

// 사용
void Run(MyDelegate method) { ... }

델리게이트 정의는 마치 메서드 선언문처럼 보이나 사실 내부적으로 컴파일러에 의해 특별한 클래스로 변환된다

즉, 델리게이트는 결국 클래스이고 내부적으로 복잡한 부분을 숨기고 사용자가 메서드 선언문 처럼 간단하게 사용할 수 있게 설계된 것이다

델리게이트가 정의된 후에는 new를 써서 델리게이트 객체를 생성하고 이를 파라미터로 전달한다

// int StringToInt(string s) { ... }

MyDelegate m = new MyDelegate(StringToInt);
Run(m);

전달된 델리게이트로부터 실제 메서드 호출

  • .Invoke() 메서드나 .BeginInvoke() 메서드를 사용
  • 일반 메서드처럼 사용
i = m.Invoke("123");

i = m("123");

예제

class Program
{
    static void Main(string[] args)
    {
        new Program().Test();
    }

    // 정의
    delegate int MyDelegate(string s);

    void Test()
    {
        // 생성
        MyDelegate m = new MyDelegate(StringToInt);

        // 메서드로 전달
        Run(m);
    }

    // 델리게이트 대상이 되는 메서드
    int StringToInt(string s)
    {
        return int.Parse(s);
    }

    // 델리게이트를 전달 받는 메서드
    void Run(MyDelegate m)
    {
        // 델리게이트로부터 메서드 실행
        int i = m("123");

        Console.WriteLine(i);
    }
}

출처: http://www.csharpstudy.com/

profile
Backend Developer

0개의 댓글