Menu
CoddyTech

__index 메타메소드

Coddy Lua 여정의 논리와 흐름 제어 섹션에 포함된 레슨. 54개 중 18번째.

테이블에 메타테이블을 연결하는 방법을 배웠으니, 이제 가장 중요한 메타메서드인 __index에 대해 알아볼 차례입니다. 이 메타메서드는 테이블에 존재하지 않는 키에 접근하려고 할 때 어떤 일이 일어나는지 제어합니다.

일반적으로 테이블에 없는 키를 조회하면 Lua는 nil을 반환합니다. 하지만 테이블에 __index 필드가 있는 메타테이블이 있으면 Lua는 대신 그 필드를 확인합니다. __index가 다른 테이블을 가리키면 Lua는 그곳에서 키를 찾습니다.

local defaults = {
    health = 100,
    speed = 10
}

local player = {name = "Alice"}
local meta = {__index = defaults}

setmetatable(player, meta)

print(player.name)    -- 출력: Alice
print(player.health)  -- 출력: 100

이 예시에서 player에는 name 키만 있습니다. player.health에 접근하면 Lua는 player에서 해당 키를 찾지 못하므로 메타테이블의 __index 필드를 확인합니다. __index가 defaults 테이블을 가리키므로 Lua는 그곳을 살펴보고 health = 100을 찾습니다.

이를 통해 한 테이블이 다른 테이블에 기본값을 제공하는 대체 메커니즘을 만들 수 있습니다. 원래 테이블은 자체 값을 유지하지만, 누락된 키는 대체 테이블에서 자동으로 조회됩니다.

__index는 함수일 수도 있습니다. 키가 없으면 Lua는 테이블과 키를 함수에 전달하고, 함수가 반환하는 값을 사용합니다:

local scores = {alice = 12}

setmetatable(scores, {
    __index = function(t, key)
        return 0  -- 없는 이름은 모두 0으로 계산됩니다
    end
})

print(scores.alice)  -- 출력: 12
print(scores.bob)    -- 출력: 0

테이블은 고정된 대체 값을 제공하지만, 함수는 누락된 키마다 값을 계산할 수 있습니다.

challenge icon

챌린지

쉬움

기본 능력치 값이 있는 캐릭터 테이블을 반환하는 createCharacterWithDefaults 함수를 작성하세요. 이 함수는 name과 level을 받습니다.

제공된 이름과 레벨로 캐릭터 테이블을 만드세요. __index가 있는 메타테이블을 사용해 누락된 능력치(health, mana, strength)에 기본값을 제공하세요.

논리:

  • 키가 health = 100, mana = 50, strength = 10인 기본값 테이블을 만드세요.
  • 키가 name(제공된 이름)과 level(제공된 레벨)인 캐릭터 테이블을 만드세요.
  • __index가 기본값 테이블을 가리키는 메타테이블을 만드세요.
  • setmetatable()을 사용해 메타테이블을 캐릭터 테이블에 연결하세요.
  • 캐릭터 테이블을 반환하세요.

매개변수:

  • name (문자열): 캐릭터의 이름
  • level (숫자): 캐릭터의 레벨

반환값: 메타테이블을 통해 이름, 레벨 및 기본 능력치에 접근할 수 있는 캐릭터 테이블(테이블)

직접 해보기

function createCharacterWithDefaults(name, level)
    -- 여기에 코드를 작성하세요
end
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

논리와 흐름 제어의 모든 레슨

직접 연습해 보세요: 온라인 Lua 컴파일러