본문 바로가기
Programming/C#

C# 14 : 람다식

by 공부합시다홍아 2020. 6. 15.

람다식

람다 계산법은 크게 함수의 정의와 변수, 그리고 함수의 적용으로 이루어져 있다 아 계산법에서는 모든 것이 함수로 이어져 있습니다.

0,1,2 ....와 같은 숫자도 함수로 표현합니다. 따라서 람다 계싼법에서는 어떤 값을 변수에 대입하고 싶으면 함수를 변수에 대입하며, 이것을 함수의 적용이라 합니다.

람다식으로 만드는 익명 메소드는 무명 함수라는 이름으로도 부릅니다. 메소드는 입력과 출력을 가지고 있다. 람다식도 마찬가지로 둘 다 가지고 있습니다.

매개_변수_목록 => 식

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

C# 컴파일러는 코드를 한층 더 간결하게 만들 수 있도록 "형식 유추"라는 기능을 제공합니다. 

 

문형식의 람다식

람다식은 말 그대로 "식" 형식을 하고 있습니다. 문 형식의 람다식은 => 연산자의 오른편에 식 대신 { }로 둘러싸인 코드 블록이 위치합니다. 

 

Func와 Action으로 더 간편하게 무명 함수 만들기

익명메소드와 무명함수는 코드를 보다 간결하게 만들어주는 요소들입니다. 하지만 이들을 선언하기 전에 해야하는 작업을 생각해 보아야한다.

대부분의 경우 단 하나의 익명 메소드나 무명함수를 만들기 위해 매번 별개의 대리자를 선언해야 한다. 

이 문제를 해결하기 위해 마이크로소프트는 .NET 프레임워크에 Func와 Action 대리자를 미리 선언해두었습니다. 

Func 대리자는 결과를 반환하는 메소드를 참조하기 위해, Action 대리자는 결과를 반환하지 않는 메소들르 참조합니다. 

(1). Func 대리자 

Func 대리자는 결과를 반환하는 메소드를 참조하기 위해 만들어졌습니다. .NET 프레임워크에는 모두 17가지 버전의 Func 대리자가 준비되있습니다. 

모든 Func 대리자의 형식 매개 변수 중 가장 마지막에 있는 것이 반환 형식입니다. 형식 매개 변수가 하나 뿐인 Func는 그 하나가 반환 형식이고, 형식 매개 변수가 두 개인 Func는 두 번째, 세 개인 Func는 세 번쨰, 그리고 17개인 Func는 열일곱 번째가 반환 형식으로 사용됩니다.

Func<int>func1 = () => 10; //입력 매개 변수는 없으며, 무조건 10일 반환

 

(2). Action 대리자 

Action 대리자는 Func 대리자와 거의 똑같습니다. 차이점이라면 Action 대리자는 반환 형식이 없는 것 뿐입니다. 

Action 대리자는 Func 대리자 처럼 17개 버전이 .NET 프레임워크에 선언되어 있습니다. 

Action 대리자의 형식 매개 변수는 모두 입력 매개 변수를 위해 선언되어 있습니다. Func와 달리 어떤 결과를 반환하는 것을 목적으로 하지 않고, 일련의 작업을 수행하는 것이 목적이기 때문이다. 한편 Action대리자는 매개 변수가 없는 버전에서부터 16개나 되는 버전까지 준비되어 있기 떄문에 프로그래머가 필요로 하는 대부분의 경우에 사용이 가능합니다.

 

식 트리 

아마 자료 구조 또는 알고리즘을 공부해본 경험이 없는 사람들은 식 트리의 개념이 생소할 것이다. 식 트리를 설명하기 전에 트리 자료 구조에 대해 먼저 알아보는 것이 좋을 것 같다. 트리는 다음과 같이 노드로 구서되며 각 노드는 서로 부모-자식 관계로 연결됩니다. 

최상위 노드 A를 트리의 뿌리가 되는 루트 노드라고 한다. 그리고 루트로 부터 뻗어 나온 노드 중 가장 끝에 있는 D,E,F,G와 같은 노드를 잎노드 또는 단말 노드라고 한다. 평범한 트리 자료 구조에서는 부모 노드가 여러 개의 자식 노드를 가질 수도 있지만, 식 트리는 한 부모 노드가 단 두 개만의 자식 노드를 가질 수 있는 이진 트리이다. 

식트리에서 연산자는 부모노드가 되며, 피연산자는 자식 노드가 됩니다. 

식트리 자료구조는 컴파일러나 인터프리터를 제작하는 데도 응용된다. 컴파일러는 프로그래밍 언어의 문법을 따라 작성된 소스 코드를 분석해서 식 트리로 만들 후 이를 바탕으로 실행 파일을 만든다. 완전한 C#컴파일러는 아니지만, C# 은 프로그래머가 C# 코드 안에서 직접 식 트리를 조립하고 컴파일해서 사용할 수 있는 기능을 제공합니다. 

식트리를 다루는 데 필요한 클래스드은 .NET프레임워크의 System.Linq.Expressions 네임스페이스 안에 준비되어있습니다.

바로 Expression 클래스와 아이들 (파생 클래스)입니다. 

  • BinaryExpression : 이항 연산자를 갖는 식을 표현

  • BlockExpression : 변수를 정의할 수 있는 식을 갖는 블록 표현

  • ConditionalExpression : 조건 연산자가 있는 식을 나타낸다.

  • ConstantExpression : 상수가 있는 식을 나타낸다.

  • DefaultExpression : 형식이나 비어 있는 식의 기본값을 표현한다.

  • DynamicExpression : 동적 작업을 나타낸다

  • GotoExpression : return, break, continue, goto와 같은 점프문을 나타냅니다.

  • IndexExpression : 배열의 인덱스 참조를 나타냅니다.

  • InvocationExpression : 대리자나 람다식 호출을 나타냅니다. 

  • LabelExpression : 레이블을 나타냅니다. 

  • LambdaExpression : 람다식을 나타냅니다. 

  • ListlnitExpression : 컬렉션 이니셜라이저가 있는 생성자 호출을 나타냅니다.

  • MemberExpression : 객체의 필드나 속성을 나타냅니다.

  • MemberlnitExpression : 생성자를 호출하고 새 객체의 멤버를 초기화하는 동작을 나타낸다.

  • MethodCallExpression : 메소드 호출을 나타냅니다.

  • NewArrayExpression : 새 배열의 생성과 초기화를 나타냅니다.

  • NewExpression : 생성자 호출을 나타냅니다.

  • ParameterExpression : 명명된 매개 변수를 나타냅니다. 

  • RuntimeVariablesExpression : 변수에 대한 런타임 읽기/쓰기 권한을 제공합니다. 

  • SwitchExpression : 다중 선택 제어식을 나타냅니다.

  • TryExpression : try~catch~finally 블록을 나타냅니다.

  • TypeBinaryExpression : 형식 테스트를 비롯한 형식과 식의 연산을 나타냅니다.

  • UnaryExpression : 단한 연산자를 갖는 식을 나타냅니다. 

위 글의 클래스들은 Expression 클래스의 파생클래스입니다. Expression클래스는 식 트리를 구성하는 노드를 표현합니다. 그래서 Expression을 상속받는 위 표의 클래스들이 식 트리의 각 노드를 표현할 수 있게 된다. 

하지만 Expression클래스는 식 트리를 구성하는 노드를 표현하는 것 외에도, 위에 열거되어 있는 클래스들의 객체르 ㄹ생성하는 역할도 담당하고 있습니다. 

Expression클래스 자신은 abstract로 선언되어 자신의 인스턴스는 만들 수 없지만, 파생 클래스의 인스턴스를 생성하는 정적 팩토리 메소드를 제공하고 있다.

 

식으로 이루어지는 멤버

메소드를 비롯하여 속성, 생성자, 종료자는 공통된 특징이 있습니다. 이들은 모두 클래스의 멤버로서 본문이 중괄호{}로 만들어져 있습니다. 이러한 멤버의 본문을 식만으로 구현하는 것이 가능합니다. 이렇게 구현된 멤버를 영어로는 "Expression-Bodied Member"라고 하고, 우리 말로는 "식 본문 멤버"라고 합니다. 

 

멤버 => 식; 

 

람다식 연습 

728x90

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

C# 16 : File(파일)  (0) 2020.06.17
c# 15 : 리플랙션  (0) 2020.06.15
C#_13 : WinForm으로 만드는 사용자 인터페이스1  (0) 2020.06.12
c#_12 : LINQ , JOIN  (0) 2020.06.12
c#_11 : 대리자와 이벤트  (0) 2020.06.12