1. 메타 테이블 메타 테이블은 루아에서 테이블을 사용하는 연산자 재정의? 또는 python을 예로 들면 __add__, __sub__ 와 같은 함수라고 볼 수 있습니다. 테이블을 함수가 아닌 연산자로 조작 할 수 있게끔 해 줍니다. > x = { value = 3 } -- x라는 테이블을 만듬 > mt = { __add = function(a,b) return { value = a.value + b.value } end } -- '+' 연산자에 대한 metatable을 작성 > setmetatable(x,mt) -- x라는 테이블에 mt를 연결 > double = x + x -- x 테이블에 '+' 연산을 하면 metatable이 수행되 덧셈 결과가 새로운 table로 반환 됨 > print(double.value) -- 새로운 테이블의 값을 출력 6 메타 함수는 __add 연산자 이외에 아래와 같은 연산자들이 있습니다. __unm : Unary 연산자 예를 들면 -1 의 -와 같은 피 연산자가 하나 인 연산자를 위한 meta 함수 __add : + 연산자 __sub : - 연산자 __mul : * 연산자 __div : / 연산자 __pow : ^ 연산자 __concat .. : string 연결 연산자 __eq : == 조건 연산자 __lt < , > less than 연산자 __le >=,<= less than or equal 연산자 연산자 이외에 table에 대한 event 들도 연결할 수 있습니다. > mt.__index = function(x,key) >> if key == 'copy_value' then return { value = x.value } end >> end > new = x.copy_value > print(new.value) 3 __newindex : 새로운 index가 추가 되었을 경우에 호출 되는 meta 함수 __metatable : metatable을 보호하기 위한 metatable 프로그램이 metatable을 수정하지 못하도록 하기 위해 재 정의 해주면 된다. 2. 메타 테이블을 이용한 클래스 우선 간단한 함수를 table 안에 만들어 보겠습니다. > instance = { value = 0, set_value = function(self, value) self.value = value end } > instance.set_value(10) ---- self 가 없어서 에러가 발생 stdin:1: attempt to index local 'self' (a number value) stack traceback: stdin:1: in function 'set_value' stdin:1: in main chunk [C]: ? > instance.set_value(instance,10) --- self에 자기 자신을 넣어서 OK > print(instance.value) 10 > instance:set_value(20) --- ':'를 쓰면 self를 안써도 됨 > print(instance.value) 20 콜론이 ":" 이 함수에서 사용 될 경우는 함수의 파라미터로 self를 생략하게 할 수 있습니다. 그럼 이제 class를 만들어 보겠습니다. class를 만들기 위한 페이지 http://lua-users.org/wiki/YetAnotherClassImplementation 추가로 링크 넣었습니다. 3. 마무리 테이블은 정말 루아에 있어서는 가장 중요한 자료 구조인 것 같다. 테이블이라는 단순한 구조를 이렇게 다양하게 변형 시키다니 신기하면서도 뭔가 독특한 구조에 재미를 느꼈다.