[C# 문법] C# Closure : 반복문 내 람다식 사용 방법

안녕하세요. 오늘은 C# 문법에서 클로저(Closure) 에 대해서 알아보려고 합니다.

참조

클로저(Closure)란?

  • 클로저(Closure)란, 외부 변수나 필드와 같은 '환경' 을 저장하고 있는 함수를 뜻합니다.
  • C#에서는 람다식을 사용하여 해당 내용을 전달할 때, 외부의 변수나 필드를 사용하는 경우 Closure 처리가 됩니다.
  • 클로저 처리되는 예를 먼저 보도록 하겠습니다.

클로저 예시

using System;

namespace ConsoleApp7
{
    class Program
    {
        static void Main(string[] args)
        {
            int length = 10;
            var actions = new Action[length];

            Console.WriteLine($"클로저(Closure) 문제 예시");

            for (var index = 0; index < length; index++)
            {
                actions[index] = () => Console.WriteLine(index);
            }

            foreach (var item in actions)
            {
                item?.Invoke();
            }
        }
    }
}

실행 결과

클로저(Closure) 문제 예시
10
10
10
10
10
10
10
10
10
10
  • 위의 코드를 실행 시켜본 결과, index의 값이 모두 10으로 출력되는 문제가 발생하였습니다.
  • 즉, 클로저로 처리되지 않았다는 얘기 입니다.
  • 클로저로 처리되기 위해서는 다음과 같이 코드를 변경하여야 합니다.

클로저 해결 예시

using System;

namespace ConsoleApp7
{
    class Program
    {
        static void Main(string[] args)
        {
            int length = 10;
            var actions = new Action[length];

            Console.WriteLine($"클로저 Closure 문제 해결");

            for (var index = 0; index < length; index++)
            {
                var localIndex = index;
                actions[index] = () => Console.WriteLine(localIndex);
            }

            foreach (var item in actions)
            {
                item?.Invoke();
            }
        }
    }
}

실행 결과

클로저 Closure 문제 해결
0
1
2
3
4
5
6
7
8
9
  • 람다식을 사용할 때, 외부 변수나 필드를 사용하면서 클로저 이슈를 피하려면 단순 값이 아니라 변수 그 자체를 참조하여 저장하도록 하여 사용해야 합니다.
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY