람다 식(Lambda expression)은 C#에서 익명(무명) 함수를 생성하는 데 사용되는 간결한 방식.
람다식을 사용하면 간단한 메서드의 대리자를 만들기 위해서 완전한 새 맴버를 선언하는 번거러운 작업을 떨쳐 내기 좋다.
=> 연사자를 사용하여 정의 한다.
'=>' 연산자 왼쪽에는 입력 매개변수가 오고,
오른족에는 식 또는 문 블록이 온다.
LINQ 쿼리 표현식, 이벤트 핸들러, 대리자에 대한 메서드를 정의할 때 등 다양하게 사용한다.
문 람다
문 람다는 중괄호'{}' 둘러싸인 하나 이상의 문으로 구성된다.
문 람다는 복잡한 로직을 포함하거나 여러 작업을 수행해야 할 때 사용.
반환 값이 있으면 문 람다 내에서 return 문을 명시적으로 사용해야 한다.
식 람다
식 람다는 단일 식으로 구성되며, 이 식의 결과가 람다 식의 반환 값이 된다.
식 라다는 간단한 연산(값 비교 등)에 사용되며 명시적인 return문이 필요 없다.
컴파일러가 식의 결과를 자동으로 반환 값으로 추론한다.
internal class Program
{
static void Main(string[] args)
{
// 문 람다.
Action<int> printSquare = (n) =>
{
int square = n * n;
Console.WriteLine(square);
};
Func<int, int> GetSquare = (n) =>
{
int square = n * n;
Console.WriteLine(square);
return square;
};
// 식 람다.
Func<int, int, int> add = (a, b) => a + b;
}
}
다음은 마크 미카엘리스의 ESSENTIAL C#에 나와있는 람다 식의 특성이다.
람다 식은 형식이 없기 대문에 object 형식의 멤버를 모함해 어떠한 멤버에 직접적인 접근도 불가능.
Ex 클래스의 '.'연산자 사용 불가.
string s = ((int x) => x).ToString(); // Error
람다 식은 형식이 없으므로 is 연산자 왼쪽에 사용 불가.
bool b = ((int) => x) is Funt<int, int>;
람다 식은 호환 가능한 대리자 형식으로만 변환할 수 있다.
bool을 반환하는 람다에 int를 반환하는 람다를 할당할 수 없다.
람다 식은 형식이 없으므로 로컬 변수에서 형식을 추론할 수 없다.
=> var 키워드 사용 불가.
점프 문을 이용해 람다 식의 내부에서 외부로 혹은 그 반대로 이동할 수 없다.
람다 식의 외부에 선언된 지역 변수를 람다의 외부 변수라고 한다.
이는 람다를 포함하고 있는 메서드의 매개변수도 포함한다.
람다 본문에서 외부 변수를 사용하는 경우, 이런 변수를 람다에 의해 캡처 됐다고 한다.
int factor = 10; // 외부 변수
List<int> numbers = new List<int> { 1, 2, 3, 4 };
// 람다 표현식에서 'factor' 외부 변수를 캡처하여 사용
var scaledNumbers = numbers.Select(n => n * factor).ToList();
// 결과 출력
scaledNumbers.ForEach(Console.WriteLine); // 10, 20, 30, 40 출력
// 외부 변수 값을 변경
factor = 5;
// 같은 람다 표현식을 다시 사용 (이번에는 factor 값이 5임)
var scaledNumbersAgain = numbers.Select(n => n * factor).ToList();
// 변경된 결과 출력
scaledNumbersAgain.ForEach(Console.WriteLine);