루아에서 함수가 변수이며, 기술적으론 클로저임을 알았다면, 이번에는 이것이 기반이 되어야지만 이해 할 수 있는 "비전역 함수"라는 개념을 이해 해야 한다. 난 여기서 약간 어리 둥절했다. 왜냐하면 지역 함수면 지역 함수지 비전역 함수는 또 무슨 말이지? 라는 궁금증이 생겼기 때문이다.

곰곰히 생각해 보면, 함수가 변수라는 사실이, 지역 변수가 있다면, 당연히 지역 함수라 불리우는게 맞겠지만, 아마도 기술을 표현하는 단어가 지역 함수라는 개념보다 비전역 함수라는 개념이 더 와 닫기 때문이 아닐까 한다.

C에서 함수는 전역(물론 지역으로 구현(함수 포인터로)할 순 있지만 지원하지 않는다.)이고, C++ 에선 지역 함수는 단지 멤버 함수만으로 국한 되었기 때문에, 이런 개념들과 햇갈릴꺼 같아 비전역이라는 단어를 쓰지 않았을까.. 라고 개인적으로 생각 한다.


그렇다면 비전역 함수란 무엇일까?

테이블 안에 있는 함수, 또는 특정 구역안에서만 보여지는 함수를 뜻한다. 루아에선 변수에 지역의 특징을 넣기 위해서 local 키워드를 사용 한다. 뭐, 함수도 변수이니 함수에 local 키워드만 붙이면 비전역 함수가 된다.


비전역 함수를 어떻게 정의 하나?

보통 함수 선언을 아래와 같이 할 것이다.

여기에 비전역 f() 를 선언하고자 한다면 다음 처럼 하면 된다.

이것은 다음 코드와 똑같다.


고작 이것 때문에 한 항목을 정리 하는가?

여기서 주의 해야 할 것이 있는데, 바로, 재귀 함수 호출에 있어서, 비전역 함수의 버그가 생길 수 있기 때문이다. 아래와 같은 코드를 구사하게 될 경우, 전역에 있는 함수가 호출 된다.

코드에서 보듯이 재귀 함수 호출을 하여, 비전역 f() 만 호출해야 되지만, 전역 f() 가 호출 되어 버린다는 것이다. 이럴 때는 미리 local f; 변수를 선언하고 f 에 함수를 할당하면 되는데 다음 코드를 보자

재귀가 되는것을 확인 할 수 있을 것이다. 무한 재귀 함수이니 알아서 꺼야 한다.


관련링크

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

총평

루아라고 호락호락 봐선 안되겠다 싶었다. 이것도 언어이고 이 언어를 이해 해야 한다는 생각으로 해야 겠다는 생각이 든다. 컴퓨터 언어는 다 비슷하겠지 했지만, 비슷은 하나 다르다는 것을 이번에 확실히 느껴진다.


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

댓글을 달아 주세요