<--! 수학 기호 --> [C#] 메소드를 좀 더 간결하게 만들자! : 람다식(Lambda Expression)

새소식

반응형
Language/C#

[C#] 메소드를 좀 더 간결하게 만들자! : 람다식(Lambda Expression)

  • -

*이 글은 <이것이 C#이다> 책을 바탕으로 공부한 글입니다.

 

 

람다식 (Lambda Expression)

 

람다식은 익명 메소드를 만들기 위해 사용한다. 람다식으로 만드는 익명 메소드는 무명 함수(Anonymous Function)라고도 부른다고 한다. 메소드가 입력(매개변수)출력(반환값)을 가지고 있는 것처럼 람다식 또한 마찬가지다.

기본적인 람다식을 선언하는 형식은 다음과 같다.

매개변수_목록 => 식

 

=> 연산자는 입력 연산자이다. 이 연산자는 그저 매개변수를 전달하는 역할만 한다.

람다식에서는 =>를 중심으로 왼편에는 매개변수가, 오른편에는 식이 위치한다.

// 익명 메소드를 만드려면 대리자가 필요하다.
delegate int Calculate(int a, int b);

...

static void Main(string[] args)
{
    // 두 개의 int 형식 매개변수 a, b를 받고, 둘을 더해 반환하는 익명 메소드를 람다식으로 만듦
    Calculate calc = (int a, int b) => a + b;
}

 

C# 컴파일러는 더 간결하게 만들 수 있도록 형식 유추(Type Inference)라는 기능을 제공한다.

static void Main(string[] args)
{
    Calculate calc = (a, b) => a + b;    // 매개변수 형식(Type) 생략
}

 

대리자 선언 코드로부터 C# 컴파일러가 해당 익명 메소드의 매개변수 형식을 유추해내는 것이다. 람다식을 사용하는 간단한 예제를 살펴보았다. 같은 코드를 익명 메소드와 람다식을 비교해서 보자.

// 익명 메소드
static void Main(string[] args)
{
    Calculate calc = delegate(int a, int b)
                     {
                         return a + b;
                     };
}



// 람다식
delegate int Calculate(int a, int b);
static void Main(string[] args)
{
    Calculate calc = (a , b) => a + b;
}

 

 

"람다식이 훨씬 간편하고 좋은데, 왜 익명 메소드 방법도 지원하지?"

큰 이유는 없다. MS에서 대리자를 이용한 익명 메소드를 C# 2.0에 도입했고, 람다식을 C# 3.0에서 도입했다.

이미 수많은 C# 2.0 프로그램들이 작성된 상황에서 뺄 수도 없는 노릇이었기 때문

 

 


문(Statement) 형식의 람다식

 

식의 형태가 아닌 문장을 람다식에 적고 싶을 수 있다. 그걸 위해 람다식은 문 형식 또한 지원하는데, 다음과 같이 선언할 수 있다. 

(매개변수_목록) => {
                      문장1;
                      문장2;
                      문장3;
                      ...
                   };

 

예시 코드를 한 번 보면 이해하기 쉬울 것이다.

delegate void DoSomething();

static void Main(string[] args)
{
    DoSomething Doit = ( ) =>       // 매개변수가 없을 경우에는 아무것도 넣지 않는다.
            {
                Console.WriteLine("첫 번째 문장");
                Console.WriteLine("두 번째 문장");
                Console.WriteLine("세 번째 문장");
            };
    
    Doit();
}

 

하지만 익명 메소드나 람다식이나 결국에는 사용하기 위해서는 대리자(Delegate)가 필요하다. 어차피 일회성 사용 목적으로 만든 메소드인데 대리자까지 별도로 선언해야 한다는 건 귀찮은 일이다. 그래서 MS에서는 .NETFuncAction이라는 대리자들을 미리 선언해줬다. 이 부분에 대해서는 다음 글에서 다루보록 해보자.

 

 

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.