C# - 대리자

양규빈·2023년 8월 15일

개요

메서드를 참조하는 객체로서 사용되며, 다른 메서드를 호출하고 실행할 수 있는 기능을 제공.
델리게이트는 함수 포인터와 비슷한 역할을 하며, 메서드를 매개변수로 전달하거나 메서드를 다른 메서드의 반환 값으로 사용할 수 있다.

델리게이트는 콜백 용도로 사용된다.
함수에 파라미터로 이용되는 함수이다.(값 파라미터가 아니라 함수 파라미터가 된다)

① 델리게이트 정의
delegate returnType DelegateName(parameterList);

returnType은 델리게이트가 반환하는 값의 유형을 나타내고,
DelegateName은 델리게이트의 이름이다.
parameterList는 델리게이트가 전달받는 매개변수이다.

② 델리게이트 인스턴스 생성
DelegateName delegateInstance = new DelegateName(MethodName);

델리게이트는 델리게이트 타입의 변수를 생성하여 인스턴스를 할당하는 방식으로 사용

③ 델리게이트 호출
delegateInstance(arguments);

델리게이트는 마치 메서드처럼 호출되며, 필요한 인수를 전달하여 호출.
arguments는 델리게이트가 참조하는 메서드에 전달되는 인수

④ 무명 메서드

  • 이름이 없는 대리자
  • 사용법 : delegate 함수 파라미터
  • 예시 : delegate(int num), delegate(), delegate

delegate void Method(int a, int b);
Method test1 = delegate(int num1, int num2) { };
Method test2 = delegate() { };
Method test3 = delegate{ };



코드 및 세부 설명

기본 활용

Viewer 클래스의 ChangeNum 함수에 파라미터를 넘기며, bool 반환값을 받는다.

이때, Viewer 클래스의 ChangeNum함수를 확인해보면, DelegateNum이라는 델리게이트 함수를 매개변수로 받는 것을 확인할 수 있다.

무명함수, 혹은 Tool클래스에 정의된 DelegateNum 인스턴스 메서드를 이용하여, 매개변수를 넘기는 것으로, DelegateNum 메서드에 접근하여 호출한다.

최종적으로 Main 함수에서는 Tool 함수의 processOne 함수를 호출한다.



Action

매개변수를 받지 않거나 반환값이 없는 메서드를 참조하는데 사용됩.
Action을 사용하여 메서드를 래핑하고 이를 델리게이트로 사용할 수 있다.
이를 통해 코드를 더 모듈화하고 유연하게 구성할 수 있다.

Action은 미리 정의된 여러 형식으로 제공되며, 다음과 같은 형식들이 있다:

Action: 매개변수 없이 반환값이 없는 메서드를 나타냅니다.
Action<T>: 하나의 매개변수를 받는 메서드를 나타냅니다.
Action<T1, T2>: 두 개의 매개변수를 받는 메서드를 나타냅니다.
이외에도 매개 변수를 n개 이상으로 늘리는 것도 가능하다.

원하는 제너릭 형태의 델리게이트를 미리 선언할 수 있는 키워드.

<int>가 부착된 Action은 하나의 제너릭 타입을 매개변수로 받는다.
박싱과 언박싱이 없기 때문에 비교적 퍼포먼스가 좋다.



Func

Func 델리게이트는 매개변수를 받아 처리한 후 그 결과를 반환하는 메서드를 참조할 때 사용한다.
Func 델리게이트는 반환 값의 형식을 나타내는 제네릭 형식 매개변수를 가지고 있다.

Func 델리게이트는 최대 16개까지의 제네릭 형식 매개변수를 가질 수 있으며, 맨 마지막 형식 매개변수는 반환 값의 형식을 나타낸다.

매개변수 없이 int 형식의 값을 반환하는 메서드를 참조하는 델리게이트.

System.Func<int>는 매개변수 없이 int 값을 반환하는 메서드를 참조하기 위해 사용된다.
즉, 아무런 매개변수가 없고 int 형식의 값을 반환하는 메서드를 참조할 수 있게 한다.

두 개의 제너릭을 보유했을 때는, 첫 번째 값을 파라미터로 받고, 두 번째 값을 반환한다.
즉, 인트형을 매개변수로 받고 부울형을 리턴한다.

System.Func<int, bool> 타입의 func3 델리게이트 선언 및 할당
그리고 System.Func<int> 타입의 func4 델리게이트 선언 및 할당 한다.

ReturnFunc은 인트형을 반환하는 정적 메서드이며, func4에 의해 참조되고 있다.
ReturnBool은 인트형을 파라미터를 받고, 부울형을 반환하는 정적 메서드이며, func3에 의해 참조되고 있다.



Predicate

주로 조건을 판별하는 메서드를 나타낸다.
Predicate 델리게이트는 하나의 매개변수를 받아서 bool 값을 반환하는 메서드를 참조할 때 사용한다.

반환 값이 true인지 false인지에 따라서 주어진 조건을 만족하는지 여부를 판단한다.

System.Predicate<int> 타입의 preMethod 변수 선언한다.
System.Predicate<T>는 T 형식의 값을 받아 bool 값을 반환하는 델리게이트 타입이다.

match 매개변수로 전달되는 Predicate<int> 델리게이트를 활용하여 찾을 값을 지정할 수 있다.
listNums.Find(match)를 통해 match 조건에 해당하는 첫 번째 요소를 찾아 반환한다.

정적 메서드 FindMethod를 호출하여, 1과 일치하는 값을 찾아 부울형을 반환하는 로직이다.

profile
훌륭한 개발자를 꿈꾸는 중입니다

1개의 댓글

comment-user-thumbnail
2023년 8월 15일

이렇게 유용한 정보를 공유해주셔서 감사합니다.

답글 달기