본문 바로가기

C#/C# 문법

C# delegate (델리게이트, 대리자) 기초

728x90
728x90

C#의 델리게이트는 다른 언어의 함수 포인터 혹은 functor와 비슷한 역할을 한다고 볼 수 있다.

 

함수 포인터를 몰라도 처음부터 설명할 것이니 걱정하지 않아도 된다.

 

델리게이트는 대리자 혹은 위임의 뜻을 가지고 있는데 단어에서도 알 수 있듯이 함수의 호출을 대리로 맡긴다는 의미가 된다. 어떻게 대리로 맡기는지 델리게이트를 만들면서 해보자.

Delegate 선언 및 생성

델리게이트는 다음 구조로 선언할 수 있다.

delgate 타입 대리자_이름(매개변수);

 

델리게이트의 생성 예시로 int 한 개를 매개변수로 가지고 리턴 타입이 int인 델리게이트를 생성하는 코드를 보도록 하자.

delegate int MyDelegate(int x);

Mydelegate functor;

이렇게 만들어진 델리게이트 객체에 원하는 함수를 위임할 수 있다.

Delegate 사용

그러면 이 델리게이트에 함수를 위임하려면 어떻게 해야 할까?

 

이 글에서 가지 방법을 보도록 하자.

1. 만들었던 함수 전달

기존에 작성했던 함수를 전달하는 방법이 있다.

static int GetDouble(int a)
{
    return a * 2;
}

functor = new MyDelegate(GetDouble);

int res = functor(10);

이렇게 생성자로 함수를 전달하면 functor에 GetDouble 함수를 위임하게 된다.

 

그런 다음 functor에 알맞은 인자를 넘겨서 호출하면 위임된 GetDouble 함수가 호출된다.

2. 익명 delegate 전달

함수를 따로 작성할 필요 없이 delegate 키워드를 사용해 익명 함수를 전달할 수 있다.

functor = delegate (int i)
{
    return i - 500;
}; // 괄호 끝에 세미콜론을 붙여야 한다.

functor를 호출하면 전달된 익명 함수가 호출된다.

제네릭 delegate

물론 제네릭 형식으로 된 델리게이트도 만들 수 있다.

delegate void MyPrinter<T>(T arg);

static void GenericFunc<T>(T x)
{
    Console.WriteLine($"현재 출력은 {x}입니다.");
}

MyPrinter<int> printer = new MyPrinter<int>(GenericFunc<int>);

printer(20);

// 현재 출력은 20입니다.

Delegate의 활용 (delegate chaining)

프로그래밍을 처음 공부하는 입장에서 델리게이트를 왜 써야 하는지 감이 잘 잡히지 않을 것이다.

 

사실 C#에서 delegate를 사용하는 경우는 그리 많지 않고 같은 역할을 하는 Func나 Action을 많이 쓴다. 다만 아직은 델리게이트가 무엇인지 기초를 배우는 단계이므로 Func와 Action은 다음 포스트에서 배우고 지금은 유용한 기능을 하나 보여주겠다.

 

델리게이트는 무려 +, += 연산자로 여러 메서드를 위임할 수 있다.

 

다음 코드는 4개의 메서드를 위임하는 예시이다.

delegate void ContinuousPrint();

ContinuousPrint func = new ContinuousPrint(delegate () { Console.WriteLine("초기화"); });

func += delegate ()
{
    Console.WriteLine("첫 번째 출력");
};

func += delegate ()
{
    Console.WriteLine("두 번쨰 출력");
};

func += delegate ()
{
    Console.WriteLine("세 번째 출력");
};

func();
func = null;

func의 호출 결과는 각 문장이 차례대로 호출된다.

 

이렇게 여러 메서드를 한꺼번에 호출할 일이 많을 경우 델리게이트를 사용하여 편리하게 메서드들을 호출할 수 있다.

 

단, 반환형이 있는 메서드의 경우 마지막으로 위임된 메서드의 반환 값을 반환하니 유의하도록 하자.

 

지금까지 C#에서 지원하는 델리게이트에 대해 알아보았다. 위에서 말한대로 C#을 사용할 때는 delegate 말고 Func나 Action을 많이 사용하지만 델리게이트를 알아야 이해할 수 있으니 저 둘을 사용하기 위한 예습이라 생각하면 된다. 고로 우리는 이 포스트를 통해 델리게이트가 무엇인지, 어떻게 사용하는지 배웠으니 바로 다음 포스트를 통해 이어서 공부하도록 하자.

 

https://nicotina04.tistory.com/208

 

C# Func와 Action 대리자

이 포스트에서는 델리게이트를 사용케 하는 또 다른 문법 Func와 Action에 대해 알아보도록 한다. 둘 다 위임을 하는 경우가 있고 delegate와 용어가 겹치므로 이전에 배운 대리자는 delegate, Func와 Actio

nicotina04.tistory.com

 

 

728x90
728x90

'C# > C# 문법' 카테고리의 다른 글

C# Func와 Action 대리자  (0) 2022.04.11
C# 확장 메서드 Extension Method  (0) 2022.01.02
C# ref와 out의 차이  (0) 2022.01.01