IMCAT.DEV
로그인 가입
Lua 입문 자료구조

Lua 기본 메타테이블

Lua 기본 메타테이블 — 초급

기본 메타테이블

1. 도입 (왜 배워야 하는가)

Lua에서 메타테이블은 객체지향 프로그래밍의 핵심 요소로, 객체의 행동을 정의할 수 있게 해줍니다. 메타테이블을 이해하고 활용하는 것은 Lua의 고급 기능을 사용하는 데 필수적입니다. 메타테이블이 없으면, 객체의 속성이나 메서드를 재정의하는 것이 불가능해지고, 코드의 재사용성과 유연성이 떨어지게 됩니다. 예를 들어, 게임 개발에서 다양한 객체(캐릭터, 아이템 등)의 행동을 다루기 위해 메타테이블을 활용하지 않으면, 코드가 복잡해지고 유지보수가 어려워질 수 있습니다.

2. 핵심 개념 설명

메타테이블(Metatable)은 Lua에서 테이블의 동작을 변경할 수 있는 특별한 테이블입니다. 예를 들어, 두 테이블을 더할 때 메타테이블을 사용하면 특정한 동작을 정의할 수 있습니다. 메타테이블은 객체에 대한 속성이나 메서드를 재정의할 수 있는 방법을 제공합니다.

관련 용어 정리

용어설명
메타테이블다른 테이블의 동작을 정의하는 테이블
__index테이블에서 값을 찾을 수 없는 경우 호출되는 메타필드
__add두 테이블을 더할 때 호출되는 메타필드

3. 기본 코드 예제

아래는 메타테이블을 사용하여 두 테이블을 더하는 기본 예제입니다.

-- 테이블 정의
local t1 = {value = 10}
local t2 = {value = 20}

-- 메타테이블 정의
local mt = {
    __add = function(a, b)
        return {value = a.value + b.value}
    end
}

-- 메타테이블 설정
setmetatable(t1, mt)
setmetatable(t2, mt)

-- 테이블 더하기
local result = t1 + t2

-- 결과 출력
print(result.value)  -- 결과: 30

실행 결과

30

코드 한 줄씩 동작 설명

  1. local t1 = {value = 10}: t1이라는 테이블을 정의하고, 속성 value에 10을 할당합니다.
  2. local t2 = {value = 20}: t2라는 테이블을 정의하고, 속성 value에 20을 할당합니다.
  3. local mt = {...}: 두 테이블을 더할 때 호출될 메타필드를 정의하는 메타테이블을 생성합니다.
  4. setmetatable(t1, mt): t1의 메타테이블을 mt로 설정합니다.
  5. setmetatable(t2, mt): t2의 메타테이블을 mt로 설정합니다.
  6. local result = t1 + t2: t1과 t2를 더하고, 메타테이블의 __add 메서드가 호출되어 새로운 테이블이 반환됩니다.
  7. print(result.value): result 테이블의 value 속성을 출력합니다.
  8. 4. 실전 활용 예제

  9. 쇼핑몰에서 장바구니를 구현할 때: 각 상품을 객체로 만들고, 메타테이블을 사용하여 상품의 가격을 합산하는 기능을 구현할 수 있습니다.
  10.     local product1 = {price = 100}
        local product2 = {price = 150}
    
        local mt = {
            __add = function(a, b)
                return {price = a.price + b.price}
            end
        }
    
        setmetatable(product1, mt)
        setmetatable(product2, mt)
    
        local cartTotal = product1 + product2
        print(cartTotal.price)  -- 결과: 250
  11. 게임 캐릭터의 상태 관리: 각 캐릭터의 생명력을 메타테이블을 통해 다루어, 생명력을 감소시키는 메서드를 구현할 수 있습니다.
  12.     local character = {health = 100}
        
        local mt = {
            __sub = function(a, b)
                return {health = a.health - b.health}
            end
        }
    
        setmetatable(character, mt)
    
        local damage = {health = 30}
        local newHealth = character - damage
        print(newHealth.health)  -- 결과: 70

    5. 흔한 실수와 주의사항

  13. 메타테이블을 설정하지 않음
  14. - 잘못된 코드:

         local t1 = {value = 10}
         local t2 = {value = 20}
         local result = t1 + t2  -- 에러 발생

    - 올바른 코드: 메타테이블을 설정하여야 합니다.

  15. 메타필드를 잘못 정의함
  16. - 잘못된 코드:

         local mt = {
             __add = "잘못된 정의" -- 문자열로 정의
         }

    - 올바른 코드: 함수를 사용하여 메타필드를 정의해야 합니다.

    6. 정리

    • 메타테이블은 Lua에서 객체지향 프로그래밍을 구현하는 데 필수적입니다.
    • 메타테이블을 사용하여 테이블의 동작을 재정의할 수 있습니다.
    • __index, __add와 같은 메타필드를 통해 다양한 동작을 쉽게 구현할 수 있습니다.
    • 다음에 학습하면 좋은 주제는 함수형 프로그래밍과 객체지향 프로그래밍 패턴입니다.