루아의 함수가 변수와 동등한 권한이기에, 테이블에 담거나 이리저리 관리 할 수 있다는 것을 알았다. 이번에는 클로저라는 개념을 이해야지만 한다. 생소한 "클로저" 라고 들려도별거 없다. C++ 에 아주 유사한 개념이 있기 때문이다.

루아의 함수가 변수로 취급된다면, 함수 내에 변수를 정의 할수 있을것 같은데, 정말 할 수 있는가?

다른 언어를 우선 생각해 본다면, C++ 이나 C 에선 nested function 을 지원하지 않고, C++ 에선 nested class 와 local class 를 지원한다. 이것으로 nested function 을 구현 할 수는 있다. 자바에선 nested function 을 지원 하는 것으로 알고 있으나, 직접 보지는 못했다.(모든게 객채이니 당연 할 듯) 이처럼 함수에서 함수를 정의 하는 것은 컴퓨터 언어에서 보듯이 특별한 기능이다.

루아에선 바로 이 기능 nested function을 지원한다! 뭐, 기억을 되돌려 보면, "루아에서 함수는 변수와 동등한 권한을 갖는다" 라는 문구가 떠오른다면, 당신은 루키 떠오르는 샛별! 함수 안에서 변수를 선언하는것이 그렇게 어렵지 않은 루아에선 오히려 당연한 기능이라는 것이다.


루아에선 이것은 무엇을 의미 하는가?

함수 안에서 함수를 정의 하는것은 nested function 이 base function의 변수에 직접 접근 할 수 있다는 것을 의미한다. 이 의미가 여기서 끝나는 것이 아니라, base function 의 변수는 nested function 이 사용 하는한 "살아 있다"는 것이 매우 중요하다.

만약 base function 이 nested function 을 리턴 했을 때, nested function가 base function 의 지역 변수를 사용 했을 때, 그 변수는 독립적 살아 있어 nested function만이 그 변수에 접근이 허용 된다.

만약 base function 으로 3개의 nested function 을 만들었다면, 마찬가지로 각각 3개의 독립적인 변수가 만들어지고 각 nested function 에서만 접근이 가능하다.


이것이 C++ 과 무엇이 닮았나?

바로 함수 오브젝트이다. 함수 오브젝트, ... 그 함수 오브젝트만이 자신의 멤버변수에 접근 할 수 있듯이 말이다.


그렇다면 클로저는 무슨 뜻인가?

바로 함수와 그 함수가 사용하는 비지역 변수들의 묶음을 클로저라 한다. C++ 과 비교한다면 바로 함수 오브젝트 이다! 루아에선 모든 함수가 기술적으로 모두 클로저이다. 왜냐하면 클로저는 함수와 그 함수가 접근하는 비지역 변수들의 묶음이기 때문이다.

이것은 루아가 함수를 변수로 취급하기 때문에, 가능한 기술이라 생각 된다.


이렇게만 말하니 잘 모르겠다. 코드를 보여달라.

이렇게 사용 되는데 만약 c2를 만들면 어떻게 될까? 다음 코드를 보자.

신기하지 않는가? 정말 C++ 의 함수 오브젝트와 비슷 하다. : )


관련링크

http://www.lua.org/pil/6.1.html


총평

함수가 변수이기에 할수 있는 방법을 생각한다면, 책에서 설명하는 함수를 재정의 하는것은 쉬운죽 먹기보다 십다고 느낄 것이다. 볼래 함수를 다른 곳에 저장하고, 함수를 재정이해 원래의 함수 변수에 담기만 하면 재정의가 되기 때문이다.

기초적인 언어의 표현력은 모든 언어가 동일하 듯이 말하고자 하는 개념이 무엇인지 짚어보고 다음으로 넘어간다.


신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요