Menu
Coddy logo textTech

__tostring 메타메소드

Coddy Lua 여정의 Logic & Flow 섹션에 포함된 레슨 — 54개 중 20번째.

Lua에서 테이블을 출력할 때, 보통 table: 0x5f8a20과 같이 단순히 메모리 주소만 표시되는 도움이 되지 않는 정보를 보게 됩니다. __tostring 메타메소드를 사용하면 테이블이 문자열로 변환될 때 표시되어야 할 내용을 정확히 정의하여 이 동작을 변경할 수 있습니다.

이 메타메소드는 디버깅과 더 깔끔한 출력을 생성하는 데 특히 유용합니다. Lua가 테이블을 문자열로 변환해야 할 때(예: print()를 사용할 때), 테이블에 __tostring 필드가 있는 메타테이블이 있는지 확인합니다. 만약 있다면, Lua는 해당 함수를 호출하고 기본 표현 방식 대신 그 반환 값을 사용합니다.

이를 구현하는 방법은 다음과 같습니다:

local vector = {x = 3, y = 4}
local meta = {
    __tostring = function(t)
        return "Vector(" .. t.x .. ", " .. t.y .. ")"
    end
}

setmetatable(vector, meta)

print(vector)  -- 출력: Vector(3, 4)

__tostring 함수는 테이블을 인자로 받으며 반드시 문자열을 반환해야 합니다. 이 예제에서 이 함수는 벡터의 x 및 y 값을 읽기 쉬운 형식으로 보여주는 포맷된 문자열을 생성합니다.

이것은 코드를 작업하기 훨씬 더 쉽게 만들어 줍니다. 디버깅 중에 이해하기 어려운 메모리 주소를 보는 대신, 테이블에 무엇이 포함되어 있는지에 대한 의미 있는 정보를 얻을 수 있습니다.

challenge icon

챌린지

쉬움

xy 좌표를 인자로 받아 사용자 정의 문자열 표현을 가진 포인트 테이블을 반환하는 createPoint 함수를 작성하세요.

xy 필드를 가진 테이블을 생성하고, __tostring 메타메소드가 포함된 메타테이블을 연결한 후, tostring()을 사용하여 테이블을 문자열로 변환한 결과를 반환하세요.

로직:

  • 제공된 좌표로 설정된 xy 키를 가진 테이블을 생성합니다.
  • "Point(x, y)" 형식의 문자열을 반환하는 __tostring이 포함된 메타테이블을 생성합니다.
  • setmetatable()을 사용하여 포인트 테이블에 메타테이블을 연결합니다.
  • 사용자 정의 문자열 표현을 얻기 위해 tostring(point)를 반환합니다.

매개변수:

  • x (number): 포인트의 x 좌표
  • y (number): 포인트의 y 좌표

반환값: "Point(x, y)" 형식의 포인트에 대한 사용자 정의 문자열 표현 (string)

치트 시트

__tostring 메타메소드를 사용하면 테이블이 문자열로 변환될 때 표시되는 방식을 사용자 정의할 수 있습니다. 기본적으로 테이블을 출력하면 table: 0x5f8a20과 같은 메모리 주소가 표시됩니다.

Lua가 테이블을 문자열로 변환할 때(예: print() 사용 시), 테이블에 __tostring 필드가 있는 메타테이블이 있는지 확인합니다. 필드가 존재하면 Lua는 해당 함수를 호출하고 그 반환 값을 사용합니다.

__tostring 함수는 테이블을 인자로 받으며 반드시 문자열을 반환해야 합니다:

local vector = {x = 3, y = 4}
local meta = {
    __tostring = function(t)
        return "Vector(" .. t.x .. ", " .. t.y .. ")"
    end
}

setmetatable(vector, meta)

print(vector)  -- 출력: Vector(3, 4)

tostring()을 사용하여 테이블을 명시적으로 문자열로 변환할 수도 있으며, 이 경우 정의되어 있다면 __tostring 메타메소드가 호출됩니다.

직접 해보기

function createPoint(x, y)
    -- 여기에 코드를 작성하세요
end
quiz icon실력 점검

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

Logic & Flow의 모든 레슨