Lua - 메타테이블: 초보자 가이드
안녕하세요, 야심 찬 프로그래머 여러분! 오늘 우리는 Lua 메타테이블의 세계로 흥미로운 여정을 떠납니다. 코드를 한 줄도 작성해본 적이 없다면 걱정하지 마세요 - 저는 당신의 친절한 안내자가 되어 이 흥미로운 주제를 함께 탐구할 것입니다. 그럼 좋아하는 음료를 한 잔 마시며 시작해보죠!
메타테이블이란?
정밀한 내용에 들어가기 전에 메타테이블이 무엇인지 이해해보겠습니다. 마법의 도구 상자를 상상해보세요. 이 상자는 평범한 Lua 테이블에 초능력을 부여할 수 있습니다. 바로 메타테이블이 그 역할입니다! 메타테이블은 다른 테이블에 특별한 행동을 정의하는 일반 Lua 테이블입니다.
__index 메타메서드
이 마법의 여정의 첫 정거지는 __index
메타메서드입니다. 이 작은 마법사는 테이블에서 누락된 키를 처리하는 데 도움을 줍니다.
__index의 기본 사용법
간단한 예제를 시작해보겠습니다:
local fruits = {apple = "red", banana = "yellow"}
local metatable = {
__index = function(table, key)
return "unknown color"
end
}
setmetatable(fruits, metatable)
print(fruits.apple) -- 출력: red
print(fruits.cherry) -- 출력: unknown color
이 예제에서 우리는 fruits
테이블과 __index
함수를 포함하는 메타테이블을 만들었습니다. 존재하지 않는 키(예: "cherry")에 접근하려고 할 때 Lua는 오류를 발생시키지 않고 대신 우리의 __index
함수를 호출하여 "unknown color"를 반환합니다.
__index를 테이블로 사용
__index
메타메서드는 또한 테이블로 사용할 수 있습니다:
local animals = {dog = "woof", cat = "meow"}
local metatable = {
__index = {
cow = "moo",
pig = "oink"
}
}
setmetatable(animals, metatable)
print(animals.dog) -- 출력: woof
print(animals.cow) -- 출력: moo
여기서 animals
테이블에서 키를 찾지 못하면 Lua는 __index
테이블에서 해당 키를 찾습니다.
__newindex 메타메서드
다음은 새로운 키 할당을 관리하는 __newindex
입니다.
local protected = {}
local metatable = {
__newindex = function(table, key, value)
error("This table is read-only!")
end
}
setmetatable(protected, metatable)
protected.newKey = "test" -- 이는 오류를 유발합니다
이 예제에서 protected
테이블에 새로운 키를 추가하려는 시도는 우리의 오류 메시지를 트리거합니다. 테이블의 보디가드와 같은 역할을 합니다!
테이블에 연산자 동작 추가
이제 우리 테이블에 수학 능력을 부여해보겠습니다!
__add 메타메서드
local vector = {x = 10, y = 20}
local metatable = {
__add = function(v1, v2)
return {x = v1.x + v2.x, y = v1.y + v2.y}
end
}
setmetatable(vector, metatable)
local result = vector + {x = 5, y = 10}
print(result.x, result.y) -- 출력: 15 30
우리는 vector
테이블이 덧셈을 할 수 있도록 가르쳤습니다! __add
메타메서드는 우리가 테이블에 +
연산자를 사용할 때 호출됩니다.
__call 메타메서드
테이블을 함수처럼 행동하게 하고 싶다면 __call
을 만나보세요!
local greeter = {name = "Lua Lover"}
local metatable = {
__call = function(table, greeting)
return greeting .. ", " .. table.name .. "!"
end
}
setmetatable(greeter, metatable)
print(greeter("Hello")) -- 출력: Hello, Lua Lover!
이제 greeter
테이블은 함수처럼 호출될 수 있습니다. 마법이죠?
__tostring 메타메서드
마지막으로, __tostring
으로 우리 테이블을 더 기쁘게 보이게 만들어보겠습니다.
local person = {name = "Alice", age = 30}
local metatable = {
__tostring = function(table)
return table.name .. " is " .. table.age .. " years old"
end
}
setmetatable(person, metatable)
print(person) -- 출력: Alice is 30 years old
__tostring
메타메서드는 우리가 테이블을 문자열로 변환할 때 호출됩니다, 예를 들어 print()
를 사용할 때.
결론
축하합니다! Lua 메타테이블의 fascinatinf 세계로 첫 걸음을 뗐습니다. 우리는 누락된 키를 처리하는 __index
에서 테이블을 함수처럼 호출하는 __call
까지 다양한 내용을 다루었습니다. 연습이 완벽을 이루는 데 도움이 되니 이 개념들을 실험해보지 마세요.
여기 우리가 배운 메타메서드의 빠른 참조 표입니다:
메타메서드 | 목적 |
---|---|
__index | 누락된 키에 접근할 때 처리 |
__newindex | 새로운 키 추가를 관리 |
__add | 덧셈 행동 정의 |
__call | 테이블을 함수처럼 호출 |
__tostring | 테이블의 문자열 표현 |
계속 탐구하고, 계속 코딩하고, 가장 중요한 것은 Lua를 즐기세요! 누가 알겠는가, 다음에 무엇을 만들 것인가요?
Credits: Image by storyset