Menu
Coddy logo textTech

__index 메타메소드

Coddy Lua 여정의 Logic & Flow 섹션에 포함된 레슨 — 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

이 예제에서 playername 키만 가지고 있습니다. player.health에 접근할 때, Lua는 player에서 이를 찾지 못하므로 메타테이블의 __index 필드를 확인합니다. __indexdefaults 테이블을 가리키고 있으므로, Lua는 그곳을 확인하여 health = 100을 찾습니다.

이것은 한 테이블이 다른 테이블에 기본값을 제공할 수 있는 폴백(fallback) 메커니즘을 생성합니다. 원래 테이블은 자체 값을 유지하지만, 누락된 키는 폴백 테이블에서 자동으로 조회됩니다.

challenge icon

챌린지

쉬움

namelevel을 인자로 받아 기본 스탯 값을 가진 캐릭터 테이블을 반환하는 createCharacterWithDefaults 함수를 작성하세요.

제공된 이름과 레벨로 캐릭터 테이블을 생성하세요. __index가 포함된 메타테이블을 사용하여 누락된 스탯(health, mana, strength)에 대한 기본값을 제공해야 합니다.

로직:

  • 다음 키를 가진 기본값(defaults) 테이블을 생성합니다: health = 100, mana = 50, strength = 10
  • 다음 키를 가진 캐릭터 테이블을 생성합니다: name (제공된 이름) 및 level (제공된 레벨)
  • __index가 기본값 테이블을 가리키는 메타테이블을 생성합니다
  • setmetatable()을 사용하여 캐릭터 테이블에 메타테이블을 연결합니다
  • 캐릭터 테이블을 반환합니다

매개변수:

  • name (string): 캐릭터의 이름
  • level (number): 캐릭터의 레벨

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

치트 시트

__index 메타메서드는 테이블에 존재하지 않는 키에 접근하려고 할 때 어떤 일이 일어날지를 제어합니다.

테이블에 다른 테이블을 가리키는 __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

이는 한 테이블이 다른 테이블에 기본값을 제공할 수 있는 폴백 메커니즘을 생성합니다. 원래 테이블은 자체 값을 유지하지만, 누락된 키는 폴백 테이블에서 자동으로 조회됩니다.

직접 해보기

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

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

Logic & Flow의 모든 레슨