Menu
Coddy logo textTech

문자열 포매팅

Coddy Lua 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 70개 중 16번째.

객체를 직접 출력하면, Lua는 table: 0x55a...와 같이 단순히 메모리 주소만 나타내는 도움이 되지 않는 내용을 보여줍니다. __tostring 메타메소드를 사용하면 객체가 출력되거나 텍스트로 변환될 때 해당 객체를 나타낼 문자열을 정확하게 정의할 수 있습니다.

클래스 패턴에서는 __tostring을 클래스 테이블의 함수로 추가합니다. 클래스 자체가 인스턴스의 메타테이블 역할을 하므로, Lua는 자동으로 이 함수를 찾아 사용합니다:

local Player = {}
Player.__index = Player

function Player:new(name, level)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.level = level
    return instance
end

function Player:__tostring()
    return "Player: " .. self.name .. " (Level " .. self.level .. ")"
end

이제 Player 인스턴스를 출력할 때, Lua는 자동으로 __tostring 메서드를 호출합니다:

local hero = Player:new("Luna", 5)
print(hero)  -- 출력: Player: Luna (Level 5)

__tostring은 콜론 구문을 사용하고 self를 전달받아 모든 인스턴스 데이터에 접근할 수 있게 해준다는 점에 유의하세요. 이 함수는 반드시 문자열을 반환해야 합니다. 객체에 적합한 방식으로 형식을 지정하여 여러 속성을 읽기 쉬운 표현으로 결합할 수 있습니다.

challenge icon

챌린지

쉬움

자신을 소개할 줄 아는 Book 클래스를 만들어 봅시다! 책을 직접 출력할 때, __tostring 메타메소드 덕분에 Lua는 암호 같은 메모리 주소 대신 멋지게 형식화된 문자열을 표시하게 됩니다.

코드는 두 개의 파일로 구성됩니다:

  • Book.lua: 표준 프로토타입 패턴을 사용하여 Book 클래스를 정의합니다. 각 책은 titleauthor를 저장해야 합니다. :new(title, author) 생성자를 포함하고, 책을 출력할 때 읽기 쉬운 형식으로 정보가 표시되도록 __tostring 메타메소드를 구현하세요.
  • main.lua: Book 모듈을 불러오고(require), 책 인스턴스를 생성한 뒤, 직접 출력하여 사용자 정의 문자열 형식이 작동하는지 확인합니다.

__tostring 메소드는 반드시 다음 형식의 문자열을 반환해야 합니다:

"[title]" by [author]

출력 문자열 내에서 제목(title)이 큰따옴표로 감싸져 있음에 유의하세요.

네 개의 입력을 받게 됩니다:

  1. 첫 번째 책의 제목
  2. 첫 번째 책의 저자
  3. 두 번째 책의 제목
  4. 두 번째 책의 저자

메인 파일에서 제공된 입력값을 사용하여 두 개의 책을 생성하고, 각 책을 직접 출력하세요 (메소드를 호출하는 것이 아니라 print(book)을 사용하세요). 각 책은 별도의 줄에 출력되어야 합니다.

예를 들어, 입력값이 The Hobbit, J.R.R. Tolkien, 1984, George Orwell이라면 출력은 다음과 같아야 합니다:

"The Hobbit" by J.R.R. Tolkien
"1984" by George Orwell

__tostring은 반드시 문자열을 반환해야 하며, 클래스 테이블이 인스턴스의 메타테이블 역할을 하므로 Lua는 책을 출력할 때 자동으로 __tostring 함수를 찾아 사용한다는 점을 기억하세요.

치트 시트

__tostring 메타메소드는 객체가 출력되거나 텍스트로 변환될 때 문자열로 표현되는 방식을 정의합니다.

__tostring이 없으면, 객체를 출력할 때 메모리 주소만 표시됩니다:

print(someObject)  -- Output: table: 0x55a...

문자열 표현을 사용자 정의하려면 클래스에 __tostring을 메소드로 추가하세요:

local Player = {}
Player.__index = Player

function Player:new(name, level)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.level = level
    return instance
end

function Player:__tostring()
    return "Player: " .. self.name .. " (Level " .. self.level .. ")"
end

인스턴스를 출력할 때, Lua는 자동으로 __tostring을 호출합니다:

local hero = Player:new("Luna", 5)
print(hero)  -- Output: Player: Luna (Level 5)

주요 사항:

  • 메소드가 self를 전달받을 수 있도록 콜론 구문(:)을 사용하세요
  • 반드시 문자열을 반환해야 합니다
  • self를 통해 인스턴스 데이터에 접근합니다
  • 클래스 테이블이 메타테이블 역할을 하므로, Lua는 __tostring을 자동으로 찾습니다

직접 해보기

-- Book 모듈을 불러옵니다
local Book = require('Book')

-- 입력을 읽습니다
local title1 = io.read()
local author1 = io.read()
local title2 = io.read()
local author2 = io.read()

-- TODO: Book:new()를 사용하여 두 개의 도서 인스턴스를 생성하세요


-- TODO: 각 도서를 직접 출력하세요 (print(book)을 사용하세요)

quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨