C# 에서 대리자는 특정 메서드를 참조하는 기능을 제공하는 중요한 개념입니다. 이번 글에서는 대리자의 형변환과 람다 표현식을 활용하여 다양한 방식으로 사용할 수 있는 방법을 정리해보겠습니다.
대리자의 형변환
Action 대리자는 반환값이 없으므로, 람다 형식으로 Console.WriteLine()을 호출할 수 있습니다. 그러나 형변환을 적용하려면 적절한 괄호 사용이 필요합니다.
((Action)(() => Console.WriteLine("Hello")))();
위 코드는 괄호가 너무 많아 하나씩 쪼개서 살펴보겠습니다.
WriteLine() 으로 출력하는 부분입니다.
() => Console.WriteLine("Hello") 는 람다 표현식을 사용하여 Console.WriteLine()을 호출하는 함수입니다.
(Action) 으로 형변환을 시도합니다.
(Action) ( () => Console.WriteLine("Hello") )
(Action) (...) 는 해당 람다 표현식을 Action 형식으로 변환합니다.
마지막으로 괄호 () 로 함수를 호출합니다.
( (Action) ( () => Console.WriteLine("Hello") ) ) ();
(...) () 는 변환된 대리자를 호출하여 실행합니다.
이처럼 대리자도 형변환이 가능하다는 사실을 확인할 수 있습니다.
반환값이 있는 대리자
Func<T> 대리자는 반환값을 가지므로, string 값을 반환하는 방식으로 작성할 수 있습니다.
((Func<string>)(() => "Hello"))();
하지만 위 코드만 실행하면 반환값을 활용하지 않기 때문에 아무 일도 일어나지 않습니다. 이를 해결하려면 Console.WriteLine()으로 출력해야 합니다.
Console.WriteLine(((Func<string>)(() => "Hello"))());
마찬가지로 위 코드를 하나씩 쪼개서 살펴보겠습니다.
() => "Hello" 는 문자열을 반환하는 람다 표현식입니다.
풀어 쓰자면 아래와 동일한 코드입니다.
string AnonFunc ()
{
return "Hello";
}
( Func<string> ) 형식으로 타입을 변환합니다.
string AnonFunc ()
{
return "Hello";
}
Func<string> MyFunc = AnonFunc;
위와 같은 코드를 한 줄로 표현한 것입니다.
( Func<string> ) ( () => "Hello" )
Func<string> 는 반환값이 있는 대리자입니다.
( (Func<string>) ( () => "Hello" ) ) ()
따라서 (...)() 는 변환된 대리자를 실행하여 반환값을 얻습니다.
그리고 이렇게 반환된 string 을 Console.WriteLine(...) 의 매개변수로 넣어 출력합니다.
매개변수가 있는 대리자 활용
그렇다면, 매개변수를 받아 그대로 출력하면서 반환도 동일한 값을 하는 방법은 없을까요?
((Func<string, string>)(msg => { Console.WriteLine(msg); return msg; }))("Hello");
msg => { Console.WriteLine(msg); return msg; } 는 매개변수 msg를 받아 출력하고, 그대로 반환하는 람다 표현식입니다.
(Func<string, string>) (...) 는 이를 Func<string, string>으로 변환합니다.
이 부분은 위에서 설명한 그대로 입니다.
그리고 이번의 Func 대리자는 string 매개 변수를 갖는 형식입니다.
( (Func<string, string>) (msg => { Console.WriteLine(msg); return msg; }) ) ( "Hello")
따라서 마지막 부분에 ( "Hello") 가 붙은 것입니다.
그리고 string 을 반환하는 형식이므로, Console.WriteLine (...) 의 매개 변수로 넣어 string 을 출력하게 됩니다. 이것도 위에서 설명한 그대로 입니다. 다만 매개 변수가 있을 경우에 대해 코드를 만들어 본 것입니다.
마무리
대리자는 < > 로 선언하여 형변환할 수 있습니다.
Action은 반환값 없이 실행하는 데 적합하고, Func<T>는 값을 반환해야 합니다.
매개변수가 있는 Func<T, TResult>를 활용하면 입력을 받아 출력 후 반환하는 것도 가능합니다.
괄호 사용이 많아지면 가독성이 떨어질 수 있으므로, 일반적인 코드에서는 이렇게까지 사용할 필요는 없습니다.
이번에 코드를 짜보면서 대리자의 형변환과 람다 표현식 활용에 대한 개념을 정리할 수 있었습니다.
다양한 방식으로 대리자를 활용할 수 있다는 점을 확인할 수 있어 유익한 시간이 되었습니다.
'C#' 카테고리의 다른 글
2. yield return 에 대해 (내부 동작) (0) | 2025.03.09 |
---|---|
1. yield return 에 대해 (개념) (0) | 2025.03.09 |
=> (람다 연산자) 이해하기 (0) | 2025.03.08 |
제네릭 (Generic) <T> 에 대해서 (0) | 2025.03.05 |
C# 에서 ? (nullable) 의 의미와 활용 방법 (0) | 2025.03.05 |