[C#] 람다(lambda)

빵욱·2024년 1월 25일

C#_Event

목록 보기
3/7

람다 식

람다 식(Lambda expression)은 C#에서 익명(무명) 함수를 생성하는 데 사용되는 간결한 방식.
람다식을 사용하면 간단한 메서드의 대리자를 만들기 위해서 완전한 새 맴버를 선언하는 번거러운 작업을 떨쳐 내기 좋다.

=> 연사자를 사용하여 정의 한다.
'=>' 연산자 왼쪽에는 입력 매개변수가 오고,
오른족에는 식 또는 문 블록이 온다.

LINQ 쿼리 표현식, 이벤트 핸들러, 대리자에 대한 메서드를 정의할 때 등 다양하게 사용한다.

  • 문 람다
    문 람다는 중괄호'{}' 둘러싸인 하나 이상의 문으로 구성된다.
    문 람다는 복잡한 로직을 포함하거나 여러 작업을 수행해야 할 때 사용.
    반환 값이 있으면 문 람다 내에서 return 문을 명시적으로 사용해야 한다.

  • 식 람다
    식 람다는 단일 식으로 구성되며, 이 식의 결과가 람다 식의 반환 값이 된다.
    식 라다는 간단한 연산(값 비교 등)에 사용되며 명시적인 return문이 필요 없다.
    컴파일러가 식의 결과를 자동으로 반환 값으로 추론한다.

Example

internal class Program
{
    static void Main(string[] args)
    {

        // 문 람다.
        Action<int> printSquare = (n) =>
        {
            int square = n * n;
            Console.WriteLine(square);
        };

        Func<int, int> GetSquare = (n) =>
        {
            int square = n * n;
            Console.WriteLine(square);
            return square;
        };

        // 식 람다.
        Func<int, int, int> add = (a, b) => a + b;
    }
}

다음은 마크 미카엘리스의 ESSENTIAL C#에 나와있는 람다 식의 특성이다.

  • 람다 식은 형식이 없기 대문에 object 형식의 멤버를 모함해 어떠한 멤버에 직접적인 접근도 불가능.
    Ex 클래스의 '.'연산자 사용 불가.
    string s = ((int x) => x).ToString(); // Error

  • 람다 식은 형식이 없으므로 is 연산자 왼쪽에 사용 불가.
    bool b = ((int) => x) is Funt<int, int>;

  • 람다 식은 호환 가능한 대리자 형식으로만 변환할 수 있다.
    bool을 반환하는 람다에 int를 반환하는 람다를 할당할 수 없다.

  • 람다 식은 형식이 없으므로 로컬 변수에서 형식을 추론할 수 없다.
    => var 키워드 사용 불가.

  • 점프 문을 이용해 람다 식의 내부에서 외부로 혹은 그 반대로 이동할 수 없다.

외부변수?

람다 식의 외부에 선언된 지역 변수를 람다의 외부 변수라고 한다.
이는 람다를 포함하고 있는 메서드의 매개변수도 포함한다.
람다 본문에서 외부 변수를 사용하는 경우, 이런 변수를 람다에 의해 캡처 됐다고 한다.

외부변수 Example

 int factor = 10; // 외부 변수
 List<int> numbers = new List<int> { 1, 2, 3, 4 };

 // 람다 표현식에서 'factor' 외부 변수를 캡처하여 사용
 var scaledNumbers = numbers.Select(n => n * factor).ToList();

 // 결과 출력
 scaledNumbers.ForEach(Console.WriteLine); // 10, 20, 30, 40 출력

 // 외부 변수 값을 변경
 factor = 5;

 // 같은 람다 표현식을 다시 사용 (이번에는 factor 값이 5임)
 var scaledNumbersAgain = numbers.Select(n => n * factor).ToList();

 // 변경된 결과 출력
 scaledNumbersAgain.ForEach(Console.WriteLine);
profile
rove drink eat

0개의 댓글