C# 8.0 람다식

D·2021년 6월 5일

C#공부

목록 보기
8/9

람다식이라는 표현은 기본적으로 람다 계산법이라는 수학이론에 기반하는 표현법이다. 1936년에 알론조 처치라는 인물이 발표한 이 이론은 문제를 함수로 추상화해서 묘사해 해결하는 계산법으로 함수를 정의하고 간결하게 만드는것이 주 목적이다.

람다 대수는 함수형 언어의 개념에 상당한 영향을 주었고 람다 대수에 기반한 첫 함수형 프로그래밍 언어인 LISP이 나왔으며 함수형 언어 외에도 람다 대수에서 파생된 다양한 프로그래밍 기법들은 현재 여러 언어에서 보편적으로 쓰이고 있으며 람다 식 또한 그중 하나이다.


↑C#에서 구현된 가장 기초적인 람다식 형태

C#은 C# 3.0에서 람다식이 추가되었다. C#에서의 람다식의 구성은 다음과 같다

(매개 변수들) => 식

=> 는 매개변수와 식을 구분하기 위해 사용하는 연산자로 람다 연산자라고도 부른다

또한 람다 식은 여러문의 코드를 포함할수도 있다.

(매개 변수들) => {식; 식; 식;}


↑여러 문을 넣은 무명함수



↑둘다 같은 코드다
기본적으로 C#의 CLR은 매게변수의 형에 대해서는 자동으로 형식을 유추해서 맞는 형식으로 넣어준다. 하지만 필요하다면 직접 입력해서 넣어줄수도 있다.

람다식을 이용하면 대리자를 이용할때 보다 더 간편하게 무명함수를 만들수 있다.

↑대리자를 이용한 무명함수 생성법과 람다식을 이용한 무명함수 생성방법

하지만 이경우에도 무명함수를 사용하기 위해서 delegate 를 이용해서 대리자를 선언해줬는데 이를 따로 선언할 필요 없게 만들어주기 위해 System 네임스페이스에 Func와 Action이라는 대리자를 생성해 두었다.
↑Action 대리자의 정의
↑Func 대리자의 정의

Func 대리자는 결과를 반환하는 메소드를 참조하기 위해 만들어진 대리자이다. .NET에는 Func대리자가 17개 정의되어 있는데 각각 매개변수가 없는 버전에서부터 시작해서 16개의 매개변수를 가진 함수를 참조할수 있는 형태로 되어있다. Func 대리자의 맨 마지막에는 항상 출력값을 적어준다.


↑Func 대리자를 이용한 무명함수 예시

Action은 반환하는 형식이 없으며 Func와 비슷하게 매개변수를 16개까지 받을수 있도록 미리 선언되어 있다

↑Action 대리자를 이용한 무명함수의 예시

변수캡처

C#에서 람다식을 쓸경우 의도된 경우와 다른 값이 나오기도 한다.

↑전부 10으로 가득차있다
C#에서 외부변수를 쓸때 제대로 할당해주지 않을경우 내부에 임시로 생성한 변수로 대입하기 때문이다



이를 해결해주기 위해서는 별도의 변수를 생성해서 내부의 변수를 캡처하게 만들어줘야된다.


↑양쪽의 IL을 비교한것. 서로 참조하고있는 변수가 다른것을 볼수있다.

C#의 람다 환경의 변수 할당의 범위는 다음과 같다.

한편 C# 9.0에서는 람다식의 매개변수에 static 한정자를 써서 의도치 않게 지역변수를 캡처하거나 하는상태를 막을수 있는 기능이 추가되었다.

출저

0개의 댓글