Action
.NET의 Action<T> delegate는 하나의 파라미터를 받아들이고, 리턴 값이 없는 함수에 사용되는 Delegate 이다.
파라미터 수에 따라 0~16개의 파라미터를 받아들이는 delegate가 있다.
즉, 파라미터가 없는 Action은 Action delegate, 파라미터가 1개인 Action<T> delegate, 2개인 Action<T1, T2> delegate ... 이렇게 16개 파라미터가 있다.
중요한 특징은 리턴 값이 없다는 점이다.
예제
public void Run()
{
System.Action<string> act = Output;
act("Hello");
//무명 메서드 지정
Action<string, string> act = delegate(string msg, string title)
{
MessageBox.Show(msg, title);
};
act2("No data found", "Error");
//람다식 사용
Action<int> act3 = code => console.WriteLine("Code : {0}", code);
act3(1033);
}
void Output(stirng s)
{
Console.WriteLine(s);
}
Func
.NET의 Func<T> delegate는 반드시 리턴타입이 Generic 폼 내에, 즉 템플린 파라미터 안에 존재한다.
즉, Func<T>의 T는 리턴값의 타입을 가리키며, 이경우 입력파라미터는 없다. (일반적으로 T를 입력과 구분하기 위해 TResult로 표현한다.) Action과 마찬가지로 입력 파라미터수에 따라 여러 변형이 존재하는데, 입력이 1개인 경우 Func<T, TResult>, 입력이 2개인 경우 Func<T1, T2, TResult>를 사용한다. Action과 같이 16개까지 입력파라미터를 받을 수 있다.
예제
//입력 X
public void Run()
{
//메서드 지정
System.Func<bool> f = IsValid;
bool result = f();
//무명 메서드 지정
Func<bool> fa = delegate
{
return _state == 0;
};
result = fa();
//람다식 사용
Func<bool> fb = () => _state == 0;
result = fb();
}
bool IsValide()
{
return _state == 0;
}
//입력 1
public void Run1()
{
//메서드 지정
System.Func<int, bool> f = IsValideRange;
bool result = f(10);
//무명 메서드 지정
Func<int,bool> fa = delegate(int n)
{
return n > 0;
}
result = fa(-1);
//람다식 이용
Func<int, bool> fb = n => n > 0;
result = fb(-2);
}
bool IsValidRange(int n)
{
return n > 0;
}
Predicate
.NET의 Predicate<T> delegate는 리턴값이 반드시 bool 이고 입력값이 T타입인 delegate이다.
입력 파라미터는 반드시 1개이다.
Array나 List 클래스의 메서드들에서 자주 사용된다.
Predicate<T>는 Func<T, bool>과 같이 표현할 수 있는데, Func이 실제로 보다 많은 함수들을 표현할 수 있다.
예제
Predicate<int> p = delegate(int n)
{
return n >= 0;
};
bool res = p(-1);
Predicate<string> p2 = s => s.StartsWith("A");
res = p2("Apple");
Delegate의 사용
Action, Predicate, Func 등의 Delegate는 .NET Framework에서 많이 사용되는데, 많은 경우 이들은 .NET Framework의 기존 메서드들에서 요구되는 파라미터로 사용되는 경우가 많다.
특히, Predicate는 Array나 List의 메서드들에서 많이 사용되고, Func는 LINQ에서 많이 사용된다.
아래 예제는 Array.Find() 메서드에서 Predicate을 파라미터로 받아들이는 경우와 LINQ의 Where() 메서드에서 Func를 사용하는 예이다.
예제
public void Run3()
{
int[] arr = { -10, -20, -30, 4, -5 };
//Predicate 사용
int pos = Array.Find(arr, IsPositive);
//Array.Find(int[], Predicate<int>)
LINQ에서 Func 사용
var v = arr.Where(n => n >= 0);
//Where(Func<int, bool> predicate)
}
bool IsPositive(int i)
{
return i >= 0;
}
'C#' 카테고리의 다른 글
[C#] 링크(LINQ) 메서드식 표현 (0) | 2023.07.17 |
---|---|
[C#] Closure(클로저) 이해하기 (0) | 2023.05.02 |
[C#] 제네릭 형식 제약조건 (1) | 2022.09.30 |
[c#] delegate 와 Event (0) | 2022.06.30 |
[c#] 추상클래스와 추상 메서드(abstract) (0) | 2021.08.20 |