E D R , A S I H C RSS

LUA_6

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. 마무리

ν…Œμ΄λΈ”μ€ 정말 루아에 μžˆμ–΄μ„œλŠ” κ°€μž₯ μ€‘μš”ν•œ 자료 ꡬ쑰인 것 κ°™λ‹€. ν…Œμ΄λΈ”μ΄λΌλŠ” λ‹¨μˆœν•œ κ΅¬μ‘°λΌ μ΄λ ‡κ²Œ λ‹€μ–‘ν•˜κ²Œ λ³€ν˜• μ‹œν‚€λ‹€λ‹ˆ μ‹ κΈ°ν•˜λ©΄μ„œλ„ λ­”κ°€ λ…νŠΉν•œ ꡬ쑰에 재λΈλΌ λŠκΌˆλ‹€.
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:37
Processing time 0.0216 sec