프로그래밍/C#

클로저 (Closure)

selinatsu 2024. 10. 19. 03:53
반응형

클로저(Closure)

클로저는 함수가 외부 범위에 있는 변수를 참조하고 기억하여 함수가 실행될 때마다 그 변수를 사용할 수 있는 개념입니다. 이 개념을 통해 람다 표현식이나 익명 함수가 외부 변수에 접근하여 그 상태를 유지하고, 나중에 함수를 호출할 때도 해당 변수를 사용할 수 있습니다.

 

클로저를 사용하는 코드 예시

 

버튼 클릭 시 클로저 사용

다음 코드는 여러 개의 버튼이 있을 때, 각 버튼에 고유한 인덱스를 기반으로 다른 동작을 할당하는 방식입니다. 이때 클로저를 사용해, 각 버튼이 클릭될 때 해당 인덱스를 기억하고 올바르게 처리할 수 있도록 합니다.

public class ButtonClosureExample : MonoBehaviour
{
    public Button[] buttons;

    void Start()
    {
        for (int i = 0; i < buttons.Length; i++)
        {
            int index = i;  // 클로저에서 참조할 변수
            buttons[i].onClick.AddListener(() => HandleButtonClick(index));
        }
    }

    void HandleButtonClick(int index)
    {
        Debug.Log("Button " + index + " clicked!");
    }
}

 

for 루프 안에서 int index = i; 부분에서 클로저가 발생합니다.

여기서 index는 각 버튼에 고유하게 할당됩니다.

람다 표현식을 사용해 버튼이 클릭될 때마다 HandleButtonClick(index) 함수가 호출됩니다.

이때, 클로저가 작동하여 index 변수가 캡처되고, 버튼이 클릭될 때마다 올바른 index 값이 출력됩니다.

 

클로저와 코루틴

다음 예시는 코루틴을 사용하여 일정 시간 후에 특정 작업을 수행하는 방식에서 클로저를 활용한 코드입니다.

 

public class CoroutineClosureExample : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(DelayedAction());
    }

    IEnumerator DelayedAction()
    {
        int delayTime = 3;  // 외부 변수

        // 클로저가 변수 delayTime을 캡처
        yield return new WaitForSeconds(delayTime);

        Debug.Log("Delayed action after " + delayTime + " seconds.");
    }
}

 

 

delayTime 변수는 코루틴 실행 중 외부 변수로 정의됩니다.

코루틴이 실행되면서, delayTime 변수를 캡처하여 이후에도 그 값을 참조할 수 있게 됩니다.

3초 대기 후, 클로저 덕분에 delayTime 변수가 유지된 상태로 로그를 출력합니다.

 

클로저의 유용성

클로저를 사용하면 함수가 종료된 이후에도 변수의 상태를 유지할 수 있습니다. 예를 들어, 버튼 클릭 이벤트나 코루틴 같은 경우, 외부 범위의 변수 상태를 그대로 기억하고 나중에 활용하는 데 클로저가 매우 유용합니다.

 

요약

**클로저(Closure)**는 함수가 외부 변수를 기억하고 참조할 수 있는 개념입니다.

코드를 작성할 때, 람다 표현식이나 코루틴에서 변수 상태를 유지하고 올바른 값을 사용하는 데 클로저가 자주 활용됩니다.

 

 

 

반응형

'프로그래밍 > C#' 카테고리의 다른 글

delegate 표현 방식들  (1) 2024.10.19
delegate 와 Action 그리고 Func  (0) 2024.10.19
Lazy<T> 에 대한 조금 더 깊이있는 이해  (1) 2024.10.14
Lazy<T>  (1) 2024.10.14
싱글톤 (Singleton)  (1) 2024.10.14