Lua - 메타테이블: 초보자 가이드

안녕하세요, 야심 찬 프로그래머 여러분! 오늘 우리는 Lua 메타테이블의 세계로 흥미로운 여정을 떠납니다. 코드를 한 줄도 작성해본 적이 없다면 걱정하지 마세요 - 저는 당신의 친절한 안내자가 되어 이 흥미로운 주제를 함께 탐구할 것입니다. 그럼 좋아하는 음료를 한 잔 마시며 시작해보죠!

Lua - Metatables

메타테이블이란?

정밀한 내용에 들어가기 전에 메타테이블이 무엇인지 이해해보겠습니다. 마법의 도구 상자를 상상해보세요. 이 상자는 평범한 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