람다식

최태선·2022년 3월 11일
0

이것이 C#이다

목록 보기
8/10

1.람다식 = 무명함수

람다식 선언

//매개변수_목록 => 식

delegate int Calculate(int a, int b);

// ....

static void Main(string[] args)
{
	Calculate calc = (int a, int b) => a+b;
}
  • C#컴파일러가 제공하는 형식유추 기능을 사용하면 더 간단히 만들 수 있다.
static void Main(string[] agrs)
{
	Calculate calc = (a,b) => a+b; // a,b의 형식을 Calculate 선언으로부터 유추해서 자동생성
}

익명메소드는 전부 람다식으로 만든다고 생각하면 편하다.

2. 문 형식의 람다식

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

delegate void DoSomething();
...
static void Main(string[] args)
{
	DoSomething DoIt () => // 매개변수가 없는 경우 아무것도 넣지 않음
    {
    	Console.WriteLine("문장1");
        Console.WriteLine("문장2");
    }
    DoIt();
}

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

무명함수를 만들기 위해서 delegate를 선언해야하는데, 이 번거로움을 해결하기위해 .NET에서는 Func, Action을 미리 만들어놓았다.
Func는 결과를 return 하는 메소드를,
Action은 결과를 return 하지 않는 메소드를 반환한다.

4.Func 대리자

Func의 형식 매개변수 중 마지막에 있는 것이 반환 형식이다.
17가지 ( 형식 매개변수가 16개까지 존재) 선언되어있다.

사용법

Func<int> func1 = () => 10; // 입력매개변수 없이 무조건 10 반환
Func<int,int> func2 = (x) => x*2;; // x*2 return

Console.WriteLine(func1()) // 10출력
Console.WriteLine(func2(3)) // 6출력 

5.Action 대리자

값을 반환하지 않는 것 빼고는 Func와 같다. 16가지 존재.

Action act1 = ()=> Consolw.WriteLine("Action()");
act1();

int result = 0;
Action <int> act2 = (x) => result = x*x;
act2(3);
Console.WriteLine(result); // 9출력;

6.식 트리

식 트리를 다루는데 필요한 클래스는 System.Linq.Expressions 네임스페이스 안에 준비되어 있다.

7.팩토리메소드

Expression const1 = Expression.Constant(1); // 상수1
Expression param1 = Expression.Parameter(typeof(int),"x"); // 매개변수 x

Expression exp = Expression.Add( const1, param1); // 1+x

ConstantExpression형식의 const1 인스턴스를 Expression 형식의 참조를 통해 가리킬 수 있다. param1, exp도 동일.
이것이 팩토리 메소드이다. (Expression이 기반클래스이기 때문)

식 트리는 식을 트리로 표현한 것에 불과하다.
exp는 실행 가능한 상태가 아니라 데이터 상 머물러 있다. 이것을 실행하기 위해서는 람다식으로 컴파일되어야한다.

*컴파일?

컴파일은 인간이 쓴 코드를 컴퓨터가 알아듣도록 0과 1로 변환하는 과정, 컴파일과 링크기능을 하는것이 컴파일러.

8.람다식으로의 컴파일 Experation< TDelegate >

Expression<Func<int,int>> lambda1 =
	Expression<Func<int,int>>.Lambda<Func<int,int>>( 
      exp, new ParameterExpression[]
      { (parameterExpression) param1 } );

Func<int,int> compiledExp = lambda1.Compile(); // 실행가능한 파일로 컴파일

Console.WriteLine( compiledExp(3) ); // x=3이면 1+3=4 이므로 4 출력

Expression 형식은 불변이기 때문에 인스턴스가 한번 만들어진 후에는 변경할 수 없다.

9.식트리를 람다식으로 만들기

using System.Linq.Expressions;

namespace ExpressionTreeViaLambda
{
	class MainApp
    {
    	static void Main(string[] args)
        {
        	Expression<Func<int,int,int>> expression =
            	(a,b) => 1*2+(a-b); // 식트리 생성완료
            Func<int,int,int> func = expression.Compile(); // 실행 가능한 파일로 컴파일
            
            // x=7,y=8
            Console.WriteLine(func(7,8)); // 1 출력
        }
    }
}

식 트리는 코드를 "데이터"로서 보관할 수 있다.

10.식으로 이루어지는 멤버

클래스 멤버를 식으로만 구현할 수 있다. 이것을 식 본문 멤버라고 한다. 영어로는 Expression-Bodied Member라고 한다.

class FriendList
{
	private List<string> list = new List<string>();
    
    public void Add(string name) => list.Add(name);
    public void Remove(string name) -> list.Remove(name);
    
    public FriendList() => Console.WriteLine("FriendList()");
    public ~FriendList() => Console.WriteLine("~FriendList()");
    
    public int Capacity => list.Capacity; // 프로퍼티, 읽기 전용 속성, get 키워드 생략가능
    public string this[int index] => list[index]; // 읽기전용 인덱서
    
    // set도 만들고 싶은 경우
    
    public int Capacity
    {
    	get => list.Capacity;
        set => list.Capacity = value;
    }
    public string this [index]
    {
    	get => list[index];
        set => list[index] = value;
    }
profile
최태선입니다

0개의 댓글