[C#] 클로저 (Closure)

0시0분·2022년 8월 6일
0

C#

목록 보기
4/9

클로저 (Closure)

람다식에서 외부의 변수를 사용하거나 처리하는 경우 클로저로 처리함.

public class Func
{   
    public Action R = () => Console.WriteLine("0");		// 람다
    public Action[] C;									// 클로저

    public Func()
    {
        C = new Action[5];
    }
}

public class Execute
{
    static void Main(string[] args)
    {
        Func func = new Func();

        Console.WriteLine("----------[Ramda]----------");
        func.R();

        Console.WriteLine("----------[Closure1]----------");
        for (int i = 0; i < 5; i++)						// 하나의 i를 참조
            func.C[i] = () => Console.WriteLine(i);		
        for (int i = 0; i < 5; i++)
            func.C[i]();

        Console.WriteLine("----------[Closure2]----------");
        for (int i = 0; i < 5; i++)
        {
            int tmp = i;								// 새로 만들어진 tmp를 참조
            func.C[i] = () => Console.WriteLine(tmp);
        }
        for (int i = 0; i < 5; i++)
            func.C[i]();
    }
}

출력 결과
----------[Ramda]----------
0
----------[Closure1]----------
5
5
5
5
5
----------[Closure2]----------
0
1
2
3
4

Nested Class

[컴파일러의 처리 방식]

람다식 처리 👉 static 메소드
클로저 처리 👉 Nested 클래스 생성


1.

for (int i = 0; i < 5; i++)						
    func.C[i] = () => Console.WriteLine(i);	
=
public class ClosureClass
{
    public int idx;
    public void Print()
    {
        Console.WriteLine(idx);
    }
}

2.

  for (int i = 0; i < 5; i++)
      func.C[i]();
=
  static void Main(string[] args)
  {
      ClosureClass cc = new ClosureClass();
      cc.idx = 0;

      cc.idx = 5;
      for (int i = 0; i < 5; i++)
          cc.Print();
  }


참고
https://www.csharpstudy.com/DevNote/Article/26

0개의 댓글