C#

[C#]람다식, 람다표현식(Lambda expression)

DevStory 2022. 5. 1.

람다식(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

댓글