루아에서 함수가 변수이며, 기술적으론 클로저임을 알았다면, 이번에는 이것이 기반이 되어야지만 이해 할 수 있는 "비전역 함수"라는 개념을 이해 해야 한다. 난 여기서 약간 어리 둥절했다. 왜냐하면 지역 함수면 지역 함수지 비전역 함수는 또 무슨 말이지? 라는 궁금증이 생겼기 때문이다. 곰곰히 생각해 보면, 함수가 변수라는 사실이, 지역 변수가 있다면, 당연히 지역 함수라 불리우는게 맞겠지만, 아마도 기술을 표현하는 단어가 지역 함수라는 개념보다 비전역 함수라는 개념이 더 와 닫기 때문이 아닐까 한다. C에서 함수는 전역(물론 지역으로 구현(함수 포인터로)할 순 있지만 지원하지 않는다.)이고, C++ 에선 지역 함수는 단지 멤버 함수만으로 국한 되었기 때문에, 이런 개념들과 햇갈릴꺼 같아 비전역이라는 단어..
전체 글 검색 결과
루아의 함수가 변수와 동등한 권한이기에, 테이블에 담거나 이리저리 관리 할 수 있다는 것을 알았다. 이번에는 클로저라는 개념을 이해야지만 한다. 생소한 "클로저" 라고 들려도별거 없다. C++ 에 아주 유사한 개념이 있기 때문이다. 루아의 함수가 변수로 취급된다면, 함수 내에 변수를 정의 할수 있을것 같은데, 정말 할 수 있는가? 다른 언어를 우선 생각해 본다면, C++ 이나 C 에선 nested function 을 지원하지 않고, C++ 에선 nested class 와 local class 를 지원한다. 이것으로 nested function 을 구현 할 수는 있다. 자바에선 nested function 을 지원 하는 것으로 알고 있으나, 직접 보지는 못했다.(모든게 객채이니 당연 할 듯) 이처럼 함수에..
앞에서 기초적인 루아 함수의 개념을 정리했다면, 이번에는 그 양념을 한번 제대로 활용해 보는 것에 중점을 둔 정리를 한다. "루아 함수는 적당한 정적 범위 지정(lexical scoping) 기능을 가진 일등급(first class) 값" 이다. 즉, 문자열이나 수치와 같은 동일한 권한을 가진 변수라는 것이다. 함수를 인수로 넘기거나, 함수를 태이블에 저장하거나 전역 변수에 저장하거나 다 가능하다는 뜻이기도 하다. 책에서는 이를 통해 루아의 막강하고 심플한 모습을 볼 수 있다고 하니까 꼭 짚고 넘어가려고 한다. 루아의 특징을 이용한다면, 당연하겠지만, 함수를 변수에 담아 둘 수가 있다. a = print 라고 하면 a("우하하하") 가 가능하다. 이 특징을 유심히 본다면, function foo( x )..
루아의 함수 개념을 이해하기 위해서 각 항목별로 정리를 했었다. 그 항목별로 읽다가 한개씩 한개씩 중요한 문장이 나오는데, 이번 항목에서는 "루아의 매개변수 전달 방식은 위치를 기반하여 행해진다." 가 중요하다고 생각한다. 루아의 함수시스템을 이해하는데, 위치를 기반으로 행해진다는 것은 C와 C++ 과는 전혀 다른 체계를 따른다는것과 같다. 아마도 동적 타입 때문에 위치로 밖에 할 수 없으니 당연할 지도 모르겠다. 이런 위치기반 인수 전달 방식의 루아 함수에서 "이름"으로 인수를 전달 할 수도 있는데, 그 이야기를 지금부터 하려고 한다. 루아의 table 이라는 자료구조를 이해했다면 다음의 table이 무엇을 나타내는지 쉽게 알 수 있을 것이다. table = { hangle_start = "ganada..
루아 함수의 그 독틈함은 간혹 C의 함수와 비슷한것이 있는데, 그 중 하나가 바로 가변 개수 인수를 받는 함수 이다. C에서 처럼 특별히 무엇인가 작업을 요하는것은 없고, 아주 간단하게 작성 할 수 있다. 다음 함수를 보자. function add ( ... ) local s = 0 for i, v in ipairs{...} do s = s + v end return s end print( add( 3, 4, 10, 25, 12 ) ) add 함수의 ...
저번 장에서 함수가 무엇이고 어떻게 정의하면서 어떻게 쓰이며 독특한 특징을 알아 봤다면, 이번에는 그 독특함 중 신기한 다중 반환에 대해서 이야기 한다. 일전에 다중 배정문에 대해서 설명을 했었다. 다중 배정문이란 a, b = 1, 2 문법을 말한다. 이 다중 반환은 이 다중 배정문을 이용하여, 할당 받을 수 있게 된다. 예를 들어 string.find("hello Lua users", "Lua") 라고 했을 경우 두개의 정수를 벹어 내는데 받을 때, s, e = string.find("hello Lua users", "Lua") 렇게 하면 된다. 그렇다면 어떻게 두개의 값을 반환시킬수 있을까? 간단하다 아래의 소스 코드처럼 하면 된다. function two_func() local m, mi = 1,2..
최근댓글