[이것이 C#이다] 14장 람다식
람다식은 익명 메소드를 만들기 위해 사용된다
-> 람다식으로 만드는 익명 메소드는 무명 함수로 불린다
⭐️ 기본 형식
매개변수_목록 -> 식 (형식 유추)
Calculate cale = (a,b) => a + b;
⭐️ 문 형식
매개변수_목록 -> {
문장1;
문장2;
문장3;
}
Func 대리자는 결과를 반환하는 메소드를 참조하기 위해 사용
⭐️ 선언식
public delegate TResult Func<int T1, int T2, out TResult>(T1 arg1, T2 arg2);
🔗 사용 예
Func<int,int,int> func3 = (x,y) => x+y; // 입력 매개변수는 int 형식 둘, 반환 형식은 int
Console.WriteLine(func3(2,3)) // 5를 출력
Action 대리자는 반환 형식이 없는 대리자
⭐️ 선언식
public delegate void Action<int T1, in T2>(T1 arg1, T2 arg2)
🔗 사용 예
Action<double, double> act3 = (x,y) =>
{
double pi = x/y;
Console.WriteLine("Action<T1, T2>({0},{1}) : {2}", x, y, pi);
};
act3(22.0,7.0);
식 본문 멤버(Expression-Bodied Member) : 메소드, 속성(인덱서), 생성자, 종료자를 식만으로 구현
⭐️ 기본 형식
멤버 -> 식;
🔗 사용 예
class FriendList
{
private List<string> list = new List<string>();
// 메소드
public void Add(string name) => list.Add(name);
public void Remove(string name) => list.Remove(name);
// 생성자, 종료자
public FriendList() => Console.WriteLine("FriendList()");
~FriendList() => Console.WriteLine("~FriendList()");
// 속성
public int Capacity => list.Capacirt; // 읽기 전용
public int Capacity
{
get => list.Capacity;
set => list.Capacity = value;
}
// 인덱서
public string this[int index] => list[index] // 읽기 전용
public string this[int index]
{
get => list[index];
set => list[index] = value;
}
}
System.Linq.Expressions
네임스페이스에 식 트리를 다루는 데 필요한 클래스들 존재
식 트리는 코드를 데이터로 보관 가능
-> 파일에 저장, 다른 프로세스로 전달, 데이터베이스 서버에 보내서 실행
Expression 클래스 : 식 트리를 구성하는 노드를 표현
abstract
로 선언되어 파생 클래스의 인스턴스를 생성하는 정적 팩토리 메소드 제공데이터 상태에 머물러 있기 때문에 실행을 위해서는 람다식으로 컴파일 필요
🔗 사용 예
Expression const1 = Expression.Constant(1); // 상수 1
Expression param1 = Expression.Parameter(typeof(int), "x") // 매개변수 x
Expression exp = Expression.Add(const1, param1); // 1 + x
Expression<Func<int, int>> lambda 1 =
Expression<Func<int,int>>.Lambda<Func<int,int>>(
exp, new ParameterExpression[]{
(ParameterExpression)param1});
Func<int,int> compiledExp = lambda1.Compile(); // 실행가능한 코드로 컴파일
Console.WriteLine(compiledExp(3)); // x = 3이면 1+x=4 이므로 4 출력
🔗 람다식 사용 예 - 동적으로 식 트리 생성은 어려움
Expression<Func<int, int>> lambda1 = (x) => 1+x;
Func<int,int> compiledExp = lambda1.Compile(); // 실행가능한 코드로 컴파일
Console.WriteLine(compiledExp(3)); // x = 3이면 1+x=4 이므로 4 출력