[C#]익명메서드와 람다식

|

2.0보다 이전 버전의 C#에서는 명명된 메서드를 사용하는 방법으로만 대리자를 선언할 수 있었습니다.

C# 2.0에는 무명 메서드가 도입되었고 C# 3.0 이상에서는 무명 메서드 대신 람다 식을 사용하여 인라인 코드를

작성하는 방법이 더 좋습니다.


1.익명메서드


// Create a delegate.
 delegate void Del(int x);

 // Instantiate the delegate using an anonymous method.
 Del d = delegate(int k) { /* ... */ };


무명 메서드를 사용하면 별도의 메서드를 만들 필요가 없으므로 대리자를 인스턴스화하는 데 따르는

코딩 오버헤드를 줄일 수 있습니다.


 예를 들어, 메서드를 생성할때 불필요한 오버헤드가 발생된다면 대리자(delegate) 대신에 코드블록을 사용

하는 것이 좋습니다. 또 다른 예는 새로운 스레드를 시작할 때입니다.


다음 클래스는 스레드를 만들고 스레드에서 실행할 코드도 포함하므로 대리자를 위한 추가 메서드를 

만들 필요가 없습니다.


void StartThread()
{
    System.Threading.Thread t1 = new System.Threading.Thread
      (delegate()
            {
                System.Console.Write("Hello, ");
                System.Console.WriteLine("World!");
            });
    t1.Start();
}


2.람다식


람다 식을 만들려면 람다 연산자 => 왼쪽에 입력 매개 변수를 지정하고(있는 경우) 다른 쪽에 식이나 문 블록을 넣습니다.

예를 들어, 람다 식 x => x * x는 이름이 x인 매개 변수를 지정하고 x 제곱 값을 반환합니다. 


다음 예제와 같이 대리자 형식에 이 식을 할당할 수도 있습니다.


delegate int del(int i);
static void Main(string[] args)
{
    del myDelegate = x => x * x;
    int j = myDelegate(5); //j = 25
}


람다식은 두가지의 방법이 존재합니다.


2-1 식 람다(expression)


 => 연산자의 오른쪽에 식이 있는 람다 식을 식 람다라고 합니다.


괄호는 람다 식에 입력 매개 변수가 하나뿐인 경우에만 생략할 수 있고 그렇지 않으면 생략할 수 없습니다.

둘 이상의 입력 매개 변수는 다음과 같이 괄호로 묶고 쉼표로 구분해야 합니다.

(x, y) => x == y


컴파일러에서 입력 형식을 유추할 수 없는 경우도 있습니다. 이와 같은 경우에는 다음 예제와 같이 형식을 

명시적으로 지정할 수 있습니다.

(int x, string s) => s.Length > x



2-2 문 람다(statement)


문 람다는 다음과 같이 중괄호 안에 문을 지정한다는 점을 제외하면 식 람다와 비슷합니다.

문 람다의 본문에 지정할 수 있는 문의 개수에는 제한이 없지만 일반적으로 2-3개 정도만 지정합니다.


delegate void TestDelegate(string s);
…
TestDelegate myDel = n => { string s = n + " " + "World"; Console.WriteLine(s); };
myDel("Hello");


And