프로그래밍/C#

delegate 와 Action 그리고 Func

selinatsu 2024. 10. 19. 04:22
반응형

**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