본문 바로가기
루아(LUA)/로블록스

루아(LUA) 클로저

by JK77 2021. 12. 28.

내부함수는 외부함수의 지역변수에 접근 할 수 있는데 외부함수의 실행이 끝나서 외부함수가 소멸된 이후에도 내부함수가 외부함수의 변수에 접근 할 수 있다. 이러한 메커니즘을 클로저라고 한다. 

 

다음 코드를 분석해 보자.

function newCounter()

    local i = 0

    return function()

                i = i + 1

                return i

            end

end

 

c1 = newCounter()

print(c1()) --> 1

print(c1()) --> 2

 

위 코드에서 변수 c1에는 익명함수가 담겨 있다. print 함수로 c1을 호출하면 외부함수의 지역변수 i를 참조하여 1를 출력한다. 그러나 이것은 조금 이상한데, 이미 외부함수를 호출했을 때 외부의 지역변수 i가 소멸되는 것이 자연스럽기 때문이다. 이처럼 클로저란 내부함수가 외부함수의 지역변수에 접근 할 수 있고, 외부함수는 외부함수의 지역변수를 사용하는 내부함수가 소멸될 때까지 소멸되지 않는 특성을 의미한다.

 

newCounter 함수를 다시 호출하면, 새 지역 변수 i를 다시 만들고 이를 새 클로저로 받아 쓰게 된다.c2 = newCounter()print(c2()) --> 1print(c1()) --> 3print(c2()) --> 2

 

c1과 c2는 같은 함수에 대한 다른 클로저가 되고, 각자 지역 변수 i로부터 만들어진 다른 인스턴스 처럼 동작한다. 사실 루아에서 우리가 함수라 부르며 호출하는 것들은 함수가 아니라 클로이다. 함수 자체는 클로저의 프로토타입일 뿐이다.

 

- 참고: 프로그래밍 루아.호베르토 이에루자림스키 p64~65.

 

 

 

 

'루아(LUA) > 로블록스' 카테고리의 다른 글

매개변수와 전달인자  (0) 2021.12.31
로블록스 함수 #1 Color3.fromRGB  (0) 2021.12.29
미로 만들기 #3  (0) 2021.12.27
텍스트 레이블 크기 100이상  (0) 2021.12.26
현실 건물을 로블록스에?  (0) 2021.12.25