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. 마무리 í…Œì´ë¸”ì€ ì •ë§ ë£¨ì•„ì— ìžˆì–´ì„œëŠ” 가장 중요한 ìžë£Œ êµ¬ì¡°ì¸ ê²ƒ 같다. í…Œì´ë¸”ì´ë¼ëŠ” 단순한 구조를 ì´ë ‡ê²Œ 다양하게 변형 시키다니 ì‹ ê¸°í•˜ë©´ì„œë„ ë”ê°€ ë…특한 êµ¬ì¡°ì— ìž¬ë¯¸ë¥¼ ëŠê¼ˆë‹¤.