C# 을 배우다 보면 자주 마주치는 기호 : =>
() => Console.WriteLine("Hello");
많은 사람들이 이것을 그냥 “람다(Lambda)”라고 부르곤 하지만, 사실 이 기호는 두 가지 전혀 다른 문법에서 사용됩니다. 즉, 모양은 같지만 의미와 쓰임새가 완전히 다른 두 가지가 존재하기 때문에, => 기호를 무조건 “람다”라고 부르는 것은 부정확한 표현입니다.
따라서 이 두 문법을 구분해서 이해한다면, 더 이상 => 때문에 헷갈릴 일은 없을 것입니다.
람다식 (Lambda Expression) : 익명 함수
람다식은 이름 없는 함수(익명 함수) 를 만들어서 delegate, Action, Func 등에 대입할 수 있도록 하는 문법입니다.
Action sayHello = () => Console.WriteLine("Hello!");
sayHello(); // 실행 결과 : 안녕하세요!
• sayHello 는 Action 대리자입니다.
• () => Console.WriteLine("Hello!") 는 익명 함수 (람다식) 이며, 이것을 람다식이라고 부릅니다.
• 이 때 => 는 매개 변수와 실행 본문을 구분하는 역할을 하며, 람다 연산자라고도 부릅니다.
또 다른 예로
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(2, 3)); // 출력: 5
여기서 (a, b) => a + b 는 하나의 함수이며, 이것도 람다식입니다.
식 본문 멤버 (Expression-bodied member)
식 본문 멤버는 메서드나 속성 등을 한 줄로 간단하게 표현할 수 있도록 만든 C# 의 축약 문법입니다.
기존에는 중괄호 {} 와 return 을 써야 했지만, 이후 C# 문법 확장으로 => 를 사용하여 간결하게 표현할 수 있게 되었습니다.
이전까지 => 은 람다식에서만 사용되었기 때문에 헤깔릴 일이 없었으나, 이후에 나온 식 본문 멤버에 사용된 => 이 축약 기호 때문에 혼란스럽게 된 것이 아닐까 생각합니다.
식 본문 멤버는 다음과 같은 항목이 포함됩니다.
• 메서드
• 읽기 전용 속성 (get)
• set 속성
• 생성자
• 소멸자
이런 항목들을 통칭해서 식 본문 멤버 라고 부릅니다.
개별로 부를 때는 '식 본문 메서드', '식 본문 생성자' 처럼 앞에 '식 본문' 이라고 붙여주면 됩니다.
public int Add(int a, int b) => a + b; // 메서드
public string Name => "Oz"; // get-only 속성
public string Name { set => name = value; } // set 속성
public Person(string name) => Name = name; // 생성자
~Person() => Console.WriteLine("소멸자 호출"); // 소멸자
위 코드들은 모두 이름이 명확한 멤버를 단순히 짧게 쓴 것이지, 익명 함수가 아닙니다.
따라서, 이 때 쓰인 => 는 축약 기호일 뿐이고, 람다 연산자와는 아무 관계가 없습니다.
다음은 식 본문 멤버 (Expression-bodied member) 들의 예시입니다.
1. 식 본문 메서드
public int Add(int a, int b)
{
return a + b;
}
// => 를 이용해 축약하면,
public int Add(int a, int b) => a + b;
2. 식 본문 속성
public string Name
{
get { return "Oz"; }
}
// => 를 이용해 축약하면,
public string Name => "Oz";
3. 식 본문 set 속성
public string Name
{
set => name = value;
}
4. 식 본문 생성자
public Person(string name) => Name = name;
5. 식 본문 finalizer (소멸자)
~Person() => Console.WriteLine("소멸자 호출");
정리
다시 한번 강조하자면, => 는 단순한 기호입니다.
하지만 쓰이는 문맥에 따라 의미가 전혀 달라집니다.
• 람다식에 쓰이면, 익명 함수를 정의하는 람다 연산자 가 되는 것이고,
• 식 본문 멤버 (expression-bodied member) 에 쓰이면, 식 본문 축약 기호로 이해해야 합니다.
'C#' 카테고리의 다른 글
C# 다형성(Polymorphism) 정리 (0) | 2025.06.23 |
---|---|
속성(Property)의 동작 원리 정리 (0) | 2025.06.23 |
구조체를 초기화하는 몇 가지 방법들 (0) | 2025.06.03 |
접근 제한자가 없는 struct, class 는 public 일까? private 일까? (0) | 2025.05.31 |
new() 의 완벽한 이해 (0) | 2025.05.20 |