티스토리 뷰

개발/C#

C# 람다식(lambda expression)

미누시 2023. 11. 8. 16:00

 
개인적인 프로젝트를 진행하면서 C#를 빈번히 사용할 일이 있어 사용하던 중에 람다식을 자주 사용하게 되면서 C++과는 다른 문법이나 기능 때문에 C# 람다식에 대해 간단히 조사할 필요가 생겼습니다.
 
이번 글에서는 제법 가볍게 학습한 람다식에 대한 지식을 바탕으로 C# 람다식을 포스팅해보겠습니다. 

 

 

람다식


 
먼저 람다식이 무엇인지 간단하게 알아보도록 하겠습니다. 람다식(또는 람다 함수)은 람다 미적분학에서 사용되는 함수 추상화 표기법(expression)으로 익명 함수로도 불리기도 합니다. 위키피디아에서는 람다식을 다음으로 정의하고 있습니다:

 

Anonymous function - Wikipedia

From Wikipedia, the free encyclopedia Function definition that is not bound to an identifier In computer programming, an anonymous function (function literal, lambda abstraction, lambda function, lambda expression or block) is a function definition that is

en.wikipedia.org

컴퓨터 프로그래밍에서, 익명 함수(함수 리터럴, 람다 추상화, 람다 함수, 람다식 또는 람다 블록)은 식별자에 바인딩(binding)되지 않은 함수 정의입니다. 함수가 한 번만 사용되거나 제한된 횟수로 사용될 때 익명 함수는 명명된 함수(named function)보다 구문론적으로 가벼울 수 있습니다.

 
 
본 포스팅은 람다 미적분학 및 람다식에 대한 깊은 이해를 다루는 목적이 아니므로 이와 관련된 제반 지식에 대한 개요를 알고자 하시는 분들은 다음 링크를 참고하시기 바랍니다.

 

Lambda calculus - Wikipedia

From Wikipedia, the free encyclopedia Mathematical-logic system based on functions Lambda calculus (also written as λ-calculus) is a formal system in mathematical logic for expressing computation based on function abstraction and application using variabl

en.wikipedia.org

 
 
현대 프로그래밍 언어에서 람다 대수를 대부분 지원하기 때문에 생소한 기능은 아닙니다. C#에서는 3.0부터 람다식을 지원하기 시작했다고 하는데, C#에서 이 람다식에 대한 부분을 알아보도록 하겠습니다.

 

 

문법 및 특징


 
C#에서 람다식은 람다 선언 연산자 =>를 이용해서 구성합니다. 람다식은 다음 두 가지 형태 중 하나를 띌 수 있습니다:

  • 식(expression) 람다 : (입력 파라미터) => 단일 표현식
  • 문(statement) 람다 : (입력 파라미터) => { 여러 표현식 }

 
C#에서 람다식은 다음과 같은 특징을 가집니다.

  • 람다식은 대리자 형식(Action, Func, Predicate)으로 변환할 수 있습니다.
  • 람다식은 표현식 트리 형식으로 변활할 수 있습니다.
  • 람다식을 메소드의 인수(파라미터)로 사용할 수 있습니다.
  • 중괄호를 사용하여 일련의 명령으로 구성된 함수를 구성할 수 있습니다.
  • discards를 사용하여 입력 파라미터를 무시할 수 있습니다(since C# 9.0)
  • 람다식의 매개변수에 대한 기본값을 제공할 수 있습니다(since C# 12.0)

 

이것에 대한 예시를 아래 코드블럭에서 확인할 수 있습니다:

public static void Main()
{
    // 람다를 대리자 형식에 할당(Action, Func, Predicate 모두 가능)
    Func<int, int> squareCallback = x => (x * x);
    Action<int> printCallback = x => Console.WriteLine(x);
    
    // 람다식을 표현식 트리 형식으로 할당
    System.Linq.Expressions.Expression<Func<int, int>> expression = x => x * x;

    // 람다식을 메소드의 인자로 사용
    int[] numbers = { 2, 3, 4, 5 };
    var squaredNumbers = numbers.Select(x => x * x);
    
    // 중괄호를 사용하여 연속된 명령을 가진 람다식 구성
    Action infiniteLoopCallback = () =>
    {
    	while(true)
        {
        	Console.WriteLine("looping...");
        }
    };
    
    // discards 키워드를 사용하여 입력 매개변수를 무시(C# 9.0 이후부터 가능)
    Func<int, int, int> constant = (_, _) => 42;

    
    // 매개변수가 1개가 아닌 경우 소괄호(parenthesis)를 사용하여 파라미터를 표현
    // 매개변수에 기본값 제공 가능(C# 12.0 이후부터 가능, .NET 7.0에 적용안됨)
    Action nothingCallback = () => { }
    Func<int, int, int> plusCallback = (x = 1, y = 2) => x + y;
    
    // params 키워드를 사용하여 배열 매개변수 입력 가능
    var sum = (params int[] values) =>
    {
        int sum = 0;
        foreach (var value in values) 
        sum += value;
    
        return sum;
    };
}

  
C++을 하다가 C# 람다식을 접하신 분들이라면 => 연산자 외에는 크게 다를 것이 없다고 느껴질 수 있다고 생각합니다. C# 람다식에 대한 더 자세한 내용은 링크를 통해서 살펴보시길 바랍니다.

 

 

레퍼런스


 

Wikipedia - Lambda calculus
Wikipedia - Anonymous function
Microsoft Learn - 람다 식 및 익명 함수
예제로 배우는 C# 프로그래밍 - C# => 람다식 (Lambda Expression)

 

댓글