개념
- 이름이 없는 메소드
- delegate변수로 즉석에서 함수를 만들어 할당하는 방식
- 휘발성 함수를 정의할 때 사용
- 지연 연산을 통한 퍼포먼스 향상
- 디버깅 시 콜스택 추적이 어려움
- 남용 시 가독성이 더욱 떨어져 이해하기가 어려워질 수 있음
- C#에서 람다식이 본격적으로 지원되기 시작한 것은 .NET Framework 3.5부터
사용 방법
- 기본적으로 .Net Framework에서 System.Func<>와 System.Action를 제공한다.
- 위 Func와 Action를 쓰지 않아도 상관은 없다.
(별도의 delegate를 만들어도 된다.)
public class AnonymousFunctionTest
{
public void VoidFunctionTest()
{
// 파라미터가 없는 void형 함수
System.Action voidFunction = () =>
{
// 함수와 동일하게 내용물을 구현
System.Console.WriteLine(string.Format("voidFunction 호출!"));
};
voidFunction();
}
public void IntFunctionTest()
{
// 파라미터가 없는 int형 함수 (결과값은 10이 찍힌다.)
System.Func<int> intFunction1 = () =>
{
return 10;
};
System.Console.WriteLine(string.Format("intFunction1 : {0}",
intFunction1()));
// 이렇게 사용할 수도 있다. (결과값은 10이 찍힌다.)
System.Func<int> intFunction2 = () => 10;
System.Console.WriteLine(string.Format("intFunction2 : {0}",
intFunction2()));
// int형 파라미터을 받는 float형 함수
// Func의 정의를 보면 Func<T, TResult>로 되어 있는데,
// 여기서 TResult가 return타입이다.
// 마찬가지로 Func의 정의를 보면
// Func <T1, T2, T3, T4, T5, T6, TResult>(T1 a, T2 b, T3 c, T4 d, T5 e, T6 f);
// 까지 정의되어 있다.
// 그리고 개인적인 의견이지만 내가 최근 공부 했던 '클린코드' 라는 책에서 말하길
// 파라미터를 많이 넘기는 함수는 안좋은 함수다.
System.Func<int, float> intFunction3 = (floatParameter) =>
{
return 1.0f;
};
// 파라미터로 100을 넘겼지만 리턴값은 1.0f이기 때문에 1.0f이 찍힌다.
System.Console.WriteLine(string.Format("intFunction3 : {0}",
intFunction3(100)));
}
public delegate void DelegateFunction(int i, float f, string str);
public void DelegateFunctionTest()
{
DelegateFunction delegateFunction = (i, f, str) =>
{
System.Console.WriteLine(string.Format("i : {0}, f : {1}, str : {2}", i, f, str));
};
// 결과값으로 "i : 0, f : 1.0, str : 테스트"가 찍힌다.
delegateFunction(0, 1.0f, "테스트");
}
}
추가적으로
- 지연 연산을 통한 퍼포먼스 향상
(나무위키에 있던 내용인데 무슨 말인지 모르겠다. 메모리상의 효율성 및 불필요한 연산의 배제가 가능하다는데..)
- 디버깅 시 콜스택 추적이 어려움
(경험상 이건 잘 모르겠다.)
- 나무위키에서는 C#에서 for문 10번 도는 코드와 람다식을 사용한 더 나은 코드가 있는데
한줄로 표현된거 말고는 솔직히 더 나은 코드인지는 모르겠다.
'프로그래밍 > 기본기ㆍ자료구조' 카테고리의 다른 글
OSI 7계층 (0) | 2021.01.28 |
---|---|
Goto (0) | 2020.09.25 |
Dictionary (딕셔너리) (0) | 2020.05.14 |
Generic (제네릭) (6) | 2020.05.13 |
Clean Code (클린코드) (5) | 2020.05.03 |