Lua 메타테이블

2015. 9. 20. 22:05프로그래밍/Script

728x90
728x90

테이블의 한계

테이블은 아주 중요한 자료형. 대부분의 작업이 테이블에서 가능하다.

하지만 한계도 있다.


ex) 테이블 간의 비교와 연산은 불가능.


1
tblRes = tbl1 + tbl2 -- X
cs


이런 것을 가능하게 하는 것이 메타테이블

테이블간의 덧셈연산도 가능하고 필요시 다른 작업으로 치환해서 사용할 수 있다.


메타테이블 정보 출력

루아에서 테이블들은 각각 메타테이블을 가지고 있다.

사용자 데이터 역시 메타테이블을 가지고 있다.


메타테이블 확인 함수

1
getmetatable(tbl)
cs


메타테이블이 설정되어 있지 않다면 해당 함수는 nil을 반환한다.


메타테이블 설정하기

1
setmetatable(tbl, metatbl)
cs


메타테이블을 지정하면 미리 정의된 함수들로 함수를 재정의 할 수 있다.

그리고 따로 함수를 정의하고 그 함수 포인터를 넘겨주는 형태인듯.

함수 포인터 + 오버라이딩 느낌






__add 함수를 union으로 재정의 하였다.

union 함수는 두 테이블을 합집합 하는 함수로 중복되는 키가 있을 경우 첫 번째 테이블의 값을 우선한다.


메타테이블 정의 지원 항목

+ 연산 - __add

- 연산 - __sub

* 연산 - __mul

/ 연산 - __div

^ 연산 - __pow

- (음수 연산자) - __unm

< 연산 - __lt

<= 연산 - __le

.. 연산 - __concat

테이블에 인덱스 값을 얻을 때 - __index

테이블에 유효한 인덱스 값을 얻을 때 - __gettable

테이블에 새로운 인덱스 값을 만들려고 할 때 - __newindex

테이블에 인덱스에 새로운 값을 저장하려고 할 때 - __settable

함수가 호출 될 때 - __call

가비지 컬렉션이 호출 될 때 - __gc

728x90
반응형

'프로그래밍 > Script' 카테고리의 다른 글

[루아] Lua에서 .과 :의 차이(?) + OOP  (4) 2015.12.17
개론  (2) 2015.10.01
Lua와 C 바인딩  (0) 2015.09.20
Lua 5.x와 4.0 호환성  (0) 2015.09.20
Lua 조건문, 반복문  (0) 2015.09.19
Lua 연산자  (0) 2015.09.19
Lua 함수  (0) 2015.09.19