**Action**과 **Func**는 모두 **delegate(대리자)**의 일종입니다.
Action과 Func는 .NET에서 미리 정의해 둔 제네릭 대리자(delegate) 타입으로, 각각 매개 변수가 있거나 없고, 반환값이 있는지 없는지에 따라 다양하게 사용할 수 있도록 제공되는 것입니다.
delegate(대리자)란
대리자는 함수를 참조할 수 있는 타입입니다.
즉, 함수를 변수처럼 다룰 수 있도록 해주는 기능입니다. 함수를 대리자에 할당한 후, 대리자를 통해 함수를 호출할 수 있습니다.
일반적으로 대리자는 사용자가 직접 정의해서 사용할 수 있지만, .NET에서는 이미 자주 사용되는 대리자를 편리하게 사용할 수 있도록 Action과 Func를 제공하고 있습니다.
Action과 Func는 delegate의 일종
**Action<T>**와 **Func<T>**는 모두 대리자의 특수한 형태입니다.
이들은 제네릭으로 정의된 대리자로, C#에서 자주 사용되는 함수 참조를 좀 더 편리하게 하기 위해 만들어진 것입니다.
Action의 특징
반환값이 없는 함수를 참조할 수 있는 대리자입니다.
Action은 매개 변수를 0개에서 최대 16개까지 받을 수 있습니다.
void 반환하는 함수를 사용할 때 유용합니다.
Func의 특징
반환값이 있는 함수를 참조할 수 있는 대리자입니다.
Func는 0개에서 최대 16개까지의 매개 변수를 받을 수 있고, 마지막 제네릭 매개 변수는 반환값의 타입을 지정합니다.
Action과 Func는 어떻게 delegate의 일종인가?
Action 예시
Action<string> printMessage = (message) => Console.WriteLine(message);
printMessage("Hello, world!"); // 출력: Hello, world!
위의 예시는 Action<string>이 매개 변수가 하나이고 반환값이 없는 함수를 참조하는 대리자입니다.
Action이 **delegate**인 이유는, 함수를 참조하고 나중에 대리자를 통해 해당 함수를 실행하기 때문입니다.
Func 예시
Func<int, int, int> add = (x, y) => x + y;
int result = add(3, 4); // result는 7
여기서 Func<int, int, int>는 매개 변수가 두 개(int, int)이고 반환값이 있는 함수(int)를 참조하는 대리자입니다. 마찬가지로, Func도 함수를 참조하고 실행하는 대리자 역할을 합니다.
왜 Action과 Func를 사용하는가?
코드 간결화
사용자가 직접 대리자 타입을 선언하지 않고도, 간단한 함수 참조를 위해 미리 정의된 대리자를 사용할 수 있습니다.
제네릭 기반
제네릭을 기반으로 매개 변수와 반환값의 타입을 자유롭게 지정할 수 있어 유연성이 높습니다.
반환값의 유무에 따른 구분
**Action**은 반환값이 없는 함수를 다루는 데 사용합니다.
**Func**은 반환값이 있는 함수를 다루는 데 사용합니다.
delegate, Action / Func
특징 | 일반 delegate | Action / Func |
대리자 정의 | 사용자가 직접 정의해야 함 | 미리 정의된 대리자 사용 (Action, Func) |
반환값과 매개 변수 |
자유롭게 설정 가능 | Action: 반환값 없음 Func: 반환값 있음 |
사용 편의성 | 사용자가 직접 타입을 정의해야 해서 코드가 길어질 수 있음 | 제네릭을 통해 간단하고 유연하게 매개변수와 반환값 설정 가능 |
예시 | delegate int MyDelegate(int x, int y); | Func<int, int, int> Action<int> |
결론
**Action**과 **Func**는 모두 대리자(delegate)의 일종입니다.
이들은 .NET에서 미리 제공되는 제네릭 대리자로, 함수의 매개 변수와 반환값을 쉽게 설정하고 사용할 수 있도록 만든 것입니다.
**Action**은 반환값이 없는 함수를, **Func**은 반환값이 있는 함수를 다루는 대리자입니다.
결국, Action과 Func도 **대리자(delegate)**이기 때문에, 함수 참조와 호출 방식은 동일합니다. 다만, 코드가 훨씬 간결해지고 편리하게 작성할 수 있다는 점에서 유용합니다.
'프로그래밍 > C#' 카테고리의 다른 글
클로저와 람다 표현식 (0) | 2024.10.19 |
---|---|
delegate 표현 방식들 (1) | 2024.10.19 |
클로저 (Closure) (0) | 2024.10.19 |
Lazy<T> 에 대한 조금 더 깊이있는 이해 (1) | 2024.10.14 |
Lazy<T> (1) | 2024.10.14 |