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