람다 연산자(`=>`)는 람다 식을 정의해요
람다 연산자(=>)는 람다 식을 정의해요
=> 토큰은 두 가지 용도로 쓰여요. 하나는 람다 연산자로서, 다른 하나는 식 본문 정의에서 멤버 이름과 멤버 구현을 구분해 주는 구분자로서요.
람다 연산자
람다 식에서 람다 연산자 =>는 왼쪽의 입력 매개 변수와 오른쪽의 람다 본문을 나눠 줘요.
어떻게 쓰는지 LINQ를 메서드 구문(method syntax)으로 써서 확인해 볼게요.
string[] words = { "bot", "apple", "apricot" };
int minimalLength = words
.Where(w => w.StartsWith("a"))
.Min(w => w.Length);
Console.WriteLine(minimalLength); // output: 5
int[] numbers = { 4, 7, 10 };
int product = numbers.Aggregate(1, (interim, next) => interim * next);
Console.WriteLine(product); // output: 280
람다 식의 입력 매개 변수는 컴파일 시점에 강력한 형식(strongly typed)으로 확정돼요. 위 예시처럼 컴파일러가 입력 매개 변수의 형식을 추론할 수 있으면 형식 선언을 생략할 수 있는데요, 반대로 형식을 직접 지정해야 할 때는 다음 예시처럼 각 매개 변수마다 형식을 적어 줘야 해요.
int[] numbers = { 4, 7, 10 };
int product = numbers.Aggregate(1, (int interim, int next) => interim * next);
Console.WriteLine(product); // output: 280
입력 매개 변수가 아예 없는 람다 식은 이렇게 정의해요.
Func<string> greet = () => "Hello, World!";
Console.WriteLine(greet());
더 자세한 내용은 람다 식 문서에서 다뤄요.
식 본문 정의
식 본문 정의(expression body definition)는 다음과 같은 일반 구문을 사용해요.
member => expression;
값을 반환하는 멤버라면 식의 결과가 그 멤버의 반환 형식으로 암시적으로 변환될 수 있어야 해요. void 멤버나 생성자·종료자·set·init·add·remove 접근자라면 본문은 문(statement) 식이어야 하는데요, 문 식은 할당·메서드 호출·개체 생성·증가/감소 연산·await 식 중 하나가 될 수 있어요. 그 결과가 있다면 버려져요.
다음은 Person.ToString 메서드의 식 본문 정의예요.
public override string ToString() => $"{fname} {lname}".Trim();
이건 아래 메서드 정의를 짧게 줄여 쓴 형태예요.
public override string ToString()
{
return $"{fname} {lname}".Trim();
}
식 본문 정의는 다음 멤버들에 쓸 수 있어요.
- 메서드와 로컬 함수: 값을 반환하는 멤버는
T M() => expression;형태고,void멤버는void M() => statementExpression;형태예요. 자세한 내용은 메서드와 로컬 함수를 참고하세요. - 연산자: 연산자는
public static T operator +(T left, T right) => expression;형태예요. 더 자세한 내용은 연산자 오버로딩 문서를 봐요. - 속성과 인덱서: 읽기 전용 속성이나 인덱서는
T P => expression;또는T this[int i] => expression;형태로 써요. 개별 접근자에도 식 본문을 쓸 수 있는데,get접근자는get => expression;,set또는init접근자는set => statementExpression;또는init => statementExpression;형태예요. 참고할 자료는 속성과 인덱서 문서예요. - 생성자와 종료자: 이 멤버들은
C() => statementExpression;또는~C() => statementExpression;형태예요. 생성자와 종료자를 참고하세요. - 이벤트 접근자:
add또는remove접근자는add => statementExpression;또는remove => statementExpression;형태로 써요. 이벤트 문서를 참고하세요.
연산자 오버로드 가능 여부
=> 연산자는 오버로드할 수 없어요.
C# 언어 사양
람다 연산자에 대한 더 자세한 내용은 C# 언어 사양의 익명 함수 식 섹션에서 확인할 수 있어요.