람다식(Lambda expression)이란?
람다식(Lambda)식은 접근자, 함수 이름, return문이 없는 익명 함수(anonymous function)입니다.
람다식을 사용하면 더 짧은 코드를 작성할 수 있으며 코드를 더 가독성 있게 만들 수 있습니다.
람다식은 람다 연산자 =>를 사용합니다.
다음은 간단한 예제입니다. int 형식의 매개변수가 존재하는 DoubleFunc메서드를 선언합니다. 이 메서드는 매개변수에 2를 곱한 결과를 반환합니다.
class Program
{
static int DoubleFunc(int num)
{
return num * 2;
}
static void Main(string[] args)
{
Console.WriteLine(DoubleFunc(10));
}
}
실행 결과
20
위 예제는 람다식으로 변환할 수 있습니다.
class Program
{
static void Main(string[] args)
{
Func<int, int> DoubleFunc = (num) => num * 2;
int num = 10;
Console.WriteLine(DoubleFunc(num));
}
}
실행 결과
20
DoubleFunc 메서드가 사라졌으며 소스 코드가 훨씬 간결해졌습니다.
대리자에 대한 개념이 부족하다면 위 코드가 어떻게 동작하는지 이해하기 어려울 수 있습니다. 다음은 대리자와 람다식 작성 방법을 설명합니다.
내장된 제네릭 대리자 Func
Func 제네릭 대리자는 0개 이상의 인수를 가지며, 마지막에 반환 타입을 작성합니다.
Func <int, double, int> FuncMethod1;
// int형 매개변수, double형 매개변수, 반환 타입은 int형
Func <int, int> FuncMethod2;
// int형 매개변수, 반환 타입은 int형
Func <int> Funcmethod3;
// 매개변수 없음, 반환 타입은 int 형
아래 예제는 Func 대리자가 DoubleFunc 메서드를 가지고 있습니다.
class Program
{
static int DoubleFunc(int num)
{
return num * 2;
}
static void Main(string[] args)
{
Func<int, int> DoubleFuncDelegate = DoubleFunc;
int num = 10;
Console.WriteLine(DoubleFuncDelegate(num));
}
}
실행 결과
20
대리자는 '대신 실행해주는 사람'이라는 뜻을 가지는 용어입니다.
Func 대리자를 사용하여 선언된 DoubleFuncDelegate 대리자는 DoubleFunc 메서드를 가리키며, DoubleFuncDelegate 대리자를 통해 DoubleFunc 메서드를 호출할 수 있습니다.
Func 람다식
위에서 Func 대리자 사용 방법을 소개했습니다. 이제 Func 대리자를 사용하여 람다식 작성하는 방법을 살펴보겠습니다.
맨 처음 람다식은 익명 함수라고 설명했습니다. 즉, 함수를 선언하지 않아도 된다는 의미입니다. 다음 예제는 DoubleFunc 메서드를 제거하고 Func 대리자가 람다식을 가리킵니다.
class Program
{
/*
static int DoubleFunc(int num)
{
return num * 2;
}
*/
static void Main(string[] args)
{
Func<int, int> DoubleFuncDelegate = num => num * 2;
int num = 10;
Console.WriteLine(DoubleFuncDelegate(num));
}
}
함수의 매개변수가 1개인 경우 소괄호를 생략해도 되지만, 2개 이상인 경우 소괄호를 사용합니다. 다음은 int형 매개변수 2개의 값을 더한 결과를 반환하는 예제입니다.
class Program
{
static void Main(string[] args)
{
// <int, int, String> int형 2개의 매개변수를 가지며, String타입의 값을 반환합니다.
// (a, b)는 매개변수입니다.
// (a + b).ToString()은 a + b 결과를 String으로 변환합니다.
Func<int, int, String> DoubleFuncDelegate = (a, b) => (a + b).ToString();
Console.WriteLine(DoubleFuncDelegate(10, 20));
}
}
실행 결과
30
내장된 제네릭 대리자 Action
Action 제네릭 대리자는 0개 이상의 인수를 가지며, void 타입을 반환합니다. void 타입을 반환하므로 반환 타입을 명시하지 않습니다.
Action <int, double, int> FuncMethod1;
// int형 매개변수, double형 매개변수, int형 매개변수
Action <int, int> FuncMethod2;
// int형 매개변수, int형 매개변수
Action <int> Funcmethod3;
// int형 매개변수
아래 예제는 Action 대리자가 ConsolePrintFunc 메서드를 가지고 있습니다.
class Program
{
static void ConsolePrintFunc(int a, int b)
{
Console.WriteLine(a + b);
}
static void Main(string[] args)
{
Action<int, int> ActionDelegate = ConsolePrintFunc;
ActionDelegate(10, 20);
}
}
실행 결과
30
Action 람다식
위에서 Action 대리자 사용 방법을 소개했습니다. 이제 Action 대리자를 사용하여 람다식 작성하는 방법을 살펴보겠습니다.
class Program
{
/*
static void ConsolePrintFunc(int a, int b)
{
Console.WriteLine(a + b);
}
*/
static void Main(string[] args)
{
Action<int, int> ActionDelegate = (a, b) => Console.WriteLine(a + b);
ActionDelegate(10, 20);
}
}
Action 대리자를 사용하여 람다식 작성하는 방법은 Func 대리자와 비슷합니다.
로컬 대리자 메서드
위에서 소개한 Func, Action 대리자 사용 방법이 어렵다면, 로컬 대리자 메서드를 사용하여 람다식을 작성할 수 있습니다.
다음은 로컬 대리자 메서드 작성 방법입니다.
int DoubleFuncDelegate(int num) => num * 2;
void ActionDelegate(int a, int b) => Console.WriteLine(a + b);
다음은 작성한 로컬 대리자 메서드를 호출하는 예제입니다.
class Program
{
static void Main(string[] args)
{
int DoubleFunc(int num) => num * 2;
Console.WriteLine(DoubleFunc(50));
void ActionFunc(int a, int b) => Console.WriteLine(a + b);
ActionFunc(10, 20);
}
}
실행 결과
100
30
로컬 대리자 메서드는 이름 그대로 로컬에서만 사용할 수 있으며, 호출 방법은 일반 메서드와 동일합니다.
결론
- 람다식은 접근자, 이름, return문이 없는 익명 함수입니다.
- Func 대리자, Action 대리자, 로컬 대리자 메서드를 사용하여 람다식을 작성할 수 있습니다.
- Func 대리자는 0개의 인수를 가지며, 반환 타입을 명시해야 합니다.
- Action 대리자는 0개의 인수를 가지며, 항상 void를 반환하므로 반환 타입을 명시하지 않아도 됩니다.
'C#' 카테고리의 다른 글
[C#]DataTable을 List로 변환 (0) | 2022.05.01 |
---|---|
[C#]텍스트 파일 쓰기 (0) | 2022.05.01 |
[C#]SortedList 클래스 (0) | 2022.02.06 |
[C#]yield 키워드 (0) | 2022.02.06 |
[C#]IEnumerable 인터페이스란? (0) | 2022.02.06 |
댓글