본문 바로가기
C#

[C#] 람다 표현식

by 대박플머 2014. 6. 16.

도대체 람다가 뭘까????

MSDN 왈 람다 식은 대리자 또는 트리 표현 형식을 만드는 데 사용할 수 있는 익명 함수입니다.

람다 식을 사용하여 인수로 전달되거나 함수 호출 값으로 반환되는 로컬 함수를 쓸 수 있습니다.

요따위로 적어 놨다. 뭐 대충 이해가 가는 사람도 있고 없는 사람도 있겠지만 그냥 익명 함수라고 알아두면 아주 편하게 사용할 수 있지 않을까 싶다. 

우선 간단하게 사용법을 알아보자. 

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

보통 이렇게 쓴다.  아주!!!! 쉽다. 

delegate = 매개변수 =>return 이런순서로 적어 주면 된다. 

한가지 예를 더 본다면 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
delegate bool D();
delegate bool D2(int i);
 
class Test
{
    D del;
    D2 del2;
    public void TestMethod(int input)
    {
        int j = 0;
        // Initialize the delegates with lambda expressions.
        // Note access to 2 outer variables.
        // del will be invoked within this method.
        del = () => { j = 10;  return j > input; };
 
        // del2 will be invoked after TestMethod goes out of scope.
        del2 = (x) => {return x == j; };
      
        // Demonstrate value of j:
        // Output: j = 0 
        // The delegate has not been invoked yet.
        Console.WriteLine("j = {0}", j);        // Invoke the delegate.
        bool boolResult = del();
 
        // Output: j = 10 b = True
        Console.WriteLine("j = {0}. b = {1}", j, boolResult);
    }
 
    static void Main()
    {
        Test test = new Test();
        test.TestMethod(5);
 
        // Prove that del2 still has a copy of
        // local variable j from TestMethod.
        bool result = test.del2(10);
 
        // Output: True
        Console.WriteLine(result);
           
        Console.ReadKey();
    }
}

보면 알겠지만 정말 그냥 익명의 함수를 만드는 것이다. 

delegate = (매개변수) => {함수 내부}

이게 정말 끝이다. 

이걸 어따 써먹냐면 뭐 다양한 곳이 있겠지만 제네릭이랑 같이 쓰면 아주 멋있는 녀석이 나온다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
using System;
 
public class Program{
    public delegate TResult Func<TArg0, TResult>(TArg0 arg0);
 
    public static void Main(){
        Func<intbool> myFunc = (x) => {return x==5;}
 
        bool result = myFunc(4);
 
        Console.WriteLine("Result : " + result);
    }
}

정말 멋있지 않은가??????? 제네릭과 람다 델리게이트의 환상적인 조합니다. 

완전 신세계다. 

당연 람다 표현식도 제약 조건이 있다. 

1. 변수는 해당 변수를 참조하는 대리자가 가비지 수집 대상이 될 때까지 가비지 수집되지 않는다.

2. 람다 식에 사용된 변수는 외부 메서드에 표시되지 않는다.

3. 람다 식은 바깥쪽 메서드에서 ref 또는 out 매개 변수를 사용할 수 없다.

4. 람다 식의 return은 익명함수의 return일 뿐이다. 

5. 점프문의 대상이 블록 외부에 있는 경우 람다 식에 람다 함수 내에 있는 goto 문, break 문 또는 continue 문을 포함할 수 없다. 대상이 블록 내에 있는 경우 람다 함수 블록 외부에 점프문을 사용해도 오류가 발생한다.


람다 효과적으로 사용하면 정말 유용한다. 하지만 항상 생각이 드는 것이지만 익명함수는 가독성이 그리 좋아 보이진 않는다. 간단하게 중간중간 가독성을 해치지 않는 선에서 사용하는 것이 좋을 것이라고 생각이 된다. 

이상 끝.....

'C#' 카테고리의 다른 글

[C#] 명시적 인터페이스(Interface) 구현  (0) 2014.06.17
[C#] Cross Thread로인한 InvalidOperationException해결법  (0) 2014.06.16
[C#] 내부 클래스  (1) 2014.06.16
[C#] 소멸자 Finalize  (0) 2014.06.13
[C#] Delegate 사용법  (0) 2014.06.12