Learning
레슨 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 — 새 키에 값을 할당할 때 호출
  • __tostringtostring() 호출 시 동작 정의
  • __add, __mul 등 — 연산자 오버로딩
💡

self:method() 구문은 self.method(self)의 축약입니다. 콜론(:)을 사용하면 첫 번째 인자로 self가 자동 전달됩니다.