Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

nomad-programmer

[Programming/C#] Lambda (익명 메소드) 본문

Programming/C#

[Programming/C#] Lambda (익명 메소드)

scii 2020. 9. 23. 21:28

람다식(Lambda Expression) 은 무명 함수(Anonymous Function) 라는 이름으로 부른다. 

// 기본적인 람다식 선언
매개변수목록 => 식

"=>" 연산자는 "입력" 연산자이다. 이 연산자가 하는 역할은 그저 매개 변수를 전달하는 것뿐이다. 람다식에서는 => 를 중심으로 왼쪽에는 매개 변수가 오른편에는 식이 위치한다.

// 익명 메소드를 위한 대리자 선언
delegate int Calculate(int a, int b);

// ...
static void Main(string[] args){
    Calulate calc = (int a, int b) => a + b;
}
C# 컴파일러는 람다를 한층 더 간결하게 만들 수 있도록 "형식 유추(Type Inference)" 라는 기능을 제공한다. 형식 유추를 이용하면 람다식에서 매개 변수의 형식을 제거할 수 있다.

람다식의 예제

using System;

namespace test
{
    // 익명 메소드를 만들기 위한 대리자 선언
    delegate int Calculate(int a, int b);

    internal class Program
    {
        public static void Main(string[] args)
        {
            // delegate를 이용한 익명 메소드
            Calculate calc1 = delegate(int a, int b) { return a + b; };

            Console.WriteLine(calc1(5, 5));

            // lambda를 이용한 익명 메소드
            Calculate calc2 = (a, b) => a + b;
            
            Console.WriteLine(calc2(5, 7));
        }
    }
}


/* 결과

10
12

*/

람다식은 대리자보다 더 간결한다. 그렇다면 왜 MS에서는 익명 메소드를 만드는 방법을 더 번거로운 대리자와 편리한 람다식을 같이 제공하는 것일까? 이유인 즉슨, MS는 대리자를 이용한 익명 메소드를 C#2.0에 도입했다. 그리고 람다식은 C#3.0에서 도입되었다. 허나 이미 수많은 프로그램들이 C#2.0으로 작성되었는데 C#3.0이 나왔다고 해당 기능을 없애버릴 순 없으니 아직도 대리자를 이용한 익명 메소드가 남아 있는 것이다.

문 형식의 람다

람다식은 말 그대로 "식(Expression)" 형식을 하고 있다. 하지만 if(a == b) return 0; else return 1; 과 같은 문 형식의 문장을 사용할 수 있다. 그리고 이것을 "문 형식의 람다(Statement Lambda)"라고 부른다.

문 형식의 람다식은 => 연산자의 오른편에 식 대신 { } 로 둘러싸인 코드 블록이 위치한다.

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

반환 형식이 없는 무명 함수는 람다식으로는 만들 수 없지만 문 형식의 람다식으로는 만들 수 있다.

delegate void DoSomething();

static void Main(string[] args){
    DoSomething dosom = () => {
        Console.WriteLine("hi!");
        Console.WriteLine("C#");
    }
    dosom();
}

문 형식의 람다식 예제

using System;

namespace test
{
    internal class Program
    {
        delegate string Concatenate(string[] args);

        public static void Main(string[] args)
        {
            Concatenate concat = (arr) =>
            {
                string result = "";
                foreach (string s in arr)
                    result += s;
                return result;
            };
            Console.WriteLine(concat(new string[] {"aa", "bb", "cc", "dd"}));
        }
    }
}


/* 결과

aabbccdd

*/
Comments