C#에서 중요한 개념 중 하나인 대리자에 대해서 정리해보겠다. 이후 이벤트와 연계해서 많이 사용한다.
대리자 (Delegate)
대리자는 말 그대로 "대신하는" 형식으로, 매개변수와 반환 형식을 지정해서 메서드를 여러개 참조할 수 있다. 예를 들어, 플레이어가 쓰는 한 스킬이 여러 기본 동작을 연계하는 것이라면, 새로운 메서드를 만들거나 해당하는 메서드를 모두 입력하는 것이 아니라 대리자에 플레이어의 동작에 해당하는(지정된 매개변수와 반환 형식) 메세드들을 등록하는 것으로 손쉽게 객체 지향적으로 구현할 수 있으며, 이는 이후 이벤트와 연계하기 좋다.
- 대리자 사용법
using System;
class DelegatePractice
{
//함수(메서드)들 생성
static void Hi() => Console.WriteLine("Hi");
static void Hello() => Console.WriteLine("Hello");
static void HiKor() => Console.WriteLine("안녕");
//대리자 생성 : 매개변수와 반환값이 없는 메서드도 담을 수 있다.
delegate void SayDelegate();
static void Main()
{
//대리자에 메서드들 등록
SayDelegate say = new SayDelegate(Hi);
say += new SayDelegate(Hello);
say += new SayDelegate(HiKor);
//위를 이렇게 줄일 수 있다
SayDelegate say2 = Hi;
say2 += Hello;
say2 += HiKor;
//대리자 사용해 호출하는 방법
say();
say.Invoke();
}
}
//출력 : Hi Hello 안녕 Hi Hello 안녕
위처럼 대리자는 마치 여러 메서드들의 집합을 가리키는 포인터라고 볼 수 있다. 이를 활용해 이름 없는 메서드를 대리자를 활용해 만들어 호출할 수 있다.
무명 메서드와 람다식으로 대체하기
대리자를 함수 포인터처럼 사용해서 delegate 키워드로 무명 메서드를 생성 및 호출할 수 있다. 다만 람다 식을 활용하면 같은 효과를 더 직관적이고 간결하게 표현할 수 있기에 간단히 다루고 람다 식으로 대체하는 법(기초)를 정리한다. 람다 식은 이후 따로 자세하게 다룰 예정
- delegate 키워드를 사용한 무명 메서드 사용
using System;
class DelegatePractice
{
//대리자 생성
delegate void HiDelegate(string msg);
delegate void AddDelegate(int a, int b);
static void Main()
{
//무명 메서드 생성
HiDelegate hi = delegate(string msg)
{
Console.WriteLine(msg);
};
//대리자 사용해 호출
hi("hi anonymous!");
//무명 메서드 생성
AddDelegate add = delegate(int a, int b)
{
Console.WriteLine(a + b);
};
//대리자 사용해 호출
add(3, 6);
}
}
//출력 : hi anonymous! 9
위의 예제를 보면 메서드를 가리키는 포인터처럼 사용하면서 함수(메서드)를 선언하고 정의하는 것과 유사하게 사용할 수 있다. 다만 람다 식을 사용해서 이를 훨씬 간결하게 사용할 수 있다. 이후 자세히 다루겠지만, 람다식을 사용하는 방법은 다음과 같다.
- 대리자 + 람다식 : 코드를 간결하게 하며, 람다 식에서 형식을 선언할 수 있다
- 참고 - 람다식 형식1(식 람다) : (매개 변수) => (식)
- - 람다식 형식2(문 람다) : (매개 변수) => { (문); }
using System;
class DelegatePractice
{
//대리자 생성
delegate void HiDelegate(string msg);
delegate void AddDelegate(int a, int b);
static void Main()
{
//람다식 활용해 생성
HiDelegate hi = (string msg) => Console.WriteLine(msg);
//대리자 사용해 호출
hi("hi anonymous!");
//람다식 활용해 생성
AddDelegate add = (int a, int b) => Console.WriteLine(a + b);
//대리자 사용해 호출
add(3, 6);
}
}
//출력 : hi anonymous! 9
만약 대리자를 생성할 때 선언한 반환값 형식이나 매개 변수 형식과, 람다식의 매개변수 및 반환값의 형식이 다를 경우 오류가 발생하며 좀 더 안정적인 구현이 가능하다
'C#' 카테고리의 다른 글
[C#] 스레드(Thread)와 동기화(lock), 병렬 처리 API(TPL) (0) | 2024.04.29 |
---|---|
[C#] 람다 식(=>), 입력 매개 변수와 자연 형식 (0) | 2024.04.29 |
[C#] 이벤트(Event) (0) | 2024.04.26 |
[C#] Action, Func, Predicate 제네릭 대리자(델리게이트; Delegate)와 매개변수에 메서드 전달 (0) | 2024.04.26 |
[C#] 참조 매개 변수, ref와 out의 차이점 (0) | 2024.04.25 |
[C#] 값 형식과 참조 형식, 박싱과 언박싱(힙 메모리), is 연산자와 as 연산자 (0) | 2024.04.25 |
[C#] 다차원 배열과 가변 배열(C/C++ 문법과 차이점) (0) | 2024.04.25 |
[C#] 널(NULL) 관련 형식[Nullable<T>] 및 연산자[??, ?.] (1) | 2024.04.24 |