문자열 포매팅
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를 전달받아 모든 인스턴스 데이터에 접근할 수 있게 해준다는 점에 유의하세요. 이 함수는 반드시 문자열을 반환해야 합니다. 객체에 적합한 방식으로 형식을 지정하여 여러 속성을 읽기 쉬운 표현으로 결합할 수 있습니다.
챌린지
쉬움자신을 소개할 줄 아는 Book 클래스를 만들어 봅시다! 책을 직접 출력할 때, __tostring 메타메소드 덕분에 Lua는 암호 같은 메모리 주소 대신 멋지게 형식화된 문자열을 표시하게 됩니다.
코드는 두 개의 파일로 구성됩니다:
Book.lua: 표준 프로토타입 패턴을 사용하여Book클래스를 정의합니다. 각 책은title과author를 저장해야 합니다.:new(title, author)생성자를 포함하고, 책을 출력할 때 읽기 쉬운 형식으로 정보가 표시되도록__tostring메타메소드를 구현하세요.main.lua: Book 모듈을 불러오고(require), 책 인스턴스를 생성한 뒤, 직접 출력하여 사용자 정의 문자열 형식이 작동하는지 확인합니다.
__tostring 메소드는 반드시 다음 형식의 문자열을 반환해야 합니다:
"[title]" by [author]출력 문자열 내에서 제목(title)이 큰따옴표로 감싸져 있음에 유의하세요.
네 개의 입력을 받게 됩니다:
- 첫 번째 책의 제목
- 첫 번째 책의 저자
- 두 번째 책의 제목
- 두 번째 책의 저자
메인 파일에서 제공된 입력값을 사용하여 두 개의 책을 생성하고, 각 책을 직접 출력하세요 (메소드를 호출하는 것이 아니라 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)을 사용하세요)
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.