레슨 3 / 3·20분
함수와 메타테이블
함수와 클로저
Lua에서 함수는 일급 객체입니다. 변수에 할당하거나 다른 함수의 인자로 전달할 수 있습니다. 클로저를 통해 외부 변수를 캡처할 수 있습니다.
lua
-- 기본 함수
local function greet(name)
return "안녕하세요, " .. name .. "님!"
end
print(greet("영희"))
-- 여러 반환값
local function minmax(a, b)
if a < b then
return a, b
else
return b, a
end
end
local lo, hi = minmax(5, 3)
print(lo, hi) -- 3 5
-- 클로저 — 외부 변수 캡처
local function counter(start)
local count = start or 0
return function()
count = count + 1
return count
end
end
local next = counter(10)
print(next()) -- 11
print(next()) -- 12
print(next()) -- 13메타테이블과 __index
메타테이블(setmetatable)은 테이블의 동작을 커스터마이즈할 수 있게 해줍니다. __index 메타메서드를 사용하면 존재하지 않는 키에 접근할 때의 동작을 정의하여 상속과 유사한 패턴을 구현할 수 있습니다.
lua
-- 메타테이블로 기본값 설정
local defaults = { color = "red", size = 10 }
local config = { size = 20 }
setmetatable(config, { __index = defaults })
print(config.size) -- 20 (자체 값)
print(config.color) -- "red" (defaults에서 가져옴)
-- 클래스 패턴 구현
local Animal = {}
Animal.__index = Animal
function Animal.new(name, sound)
local self = setmetatable({}, Animal)
self.name = name
self.sound = sound
return self
end
function Animal:speak()
print(self.name .. ": " .. self.sound)
end
local dog = Animal.new("멍멍이", "왈왈!")
local cat = Animal.new("야옹이", "미야옹~")
dog:speak() -- 멍멍이: 왈왈!
cat:speak() -- 야옹이: 미야옹~- •
setmetatable(t, mt)— 테이블 t에 메타테이블 mt 설정 - •
__index— 키가 없을 때 조회할 테이블 또는 함수 - •
__newindex— 새 키에 값을 할당할 때 호출 - •
__tostring—tostring()호출 시 동작 정의 - •
__add,__mul등 — 연산자 오버로딩
💡
self:method() 구문은 self.method(self)의 축약입니다. 콜론(:)을 사용하면 첫 번째 인자로 self가 자동 전달됩니다.