문자열 포매팅
Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 16번째.
객체를 직접 print하면 Lua는 table: 0x55a...처럼 도움이 되지 않는 내용을 표시합니다. 단순한 메모리 주소일 뿐입니다. __tostring metamethod를 사용하면 객체를 print하거나 텍스트로 변환할 때 객체를 나타내는 문자열을 정확히 정의할 수 있습니다.
class pattern에서는 클래스 테이블에 함수로 __tostring을 추가합니다. 클래스 자체가 instances의 metatable 역할을 하므로, 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 인스턴스를 print하면 Lua가 자동으로 __tostring method를 호출합니다:
local hero = Player:new("Luna", 5)
print(hero) -- 출력: Player: Luna (Level 5)__tostring이 콜론 구문을 사용하고 self를 전달받아 모든 인스턴스 데이터에 접근할 수 있다는 점에 주목하세요. 이 함수는 문자열을 반환해야 합니다. 객체에 맞는 방식이라면 어떤 형식으로든 지정할 수 있으며, 모든 속성을 결합해 읽기 쉬운 표현으로 만들 수 있습니다.
챌린지
쉬움스스로를 소개할 줄 아는 Book class를 만들어 봅시다! 책을 직접 출력하면 Lua는 해석하기 어려운 메모리 주소 대신 보기 좋게 형식화된 문자열을 표시합니다. 이 모든 것은 __tostring metamethod 덕분입니다.
코드를 두 파일로 구성합니다:
Book.lua: 표준 prototype pattern을 사용하여Bookclass를 Define합니다. 각 책은title과author를 저장해야 합니다.:new(title, author)Constructor를 포함하고__tostringmetamethod를 Implement하여 책을 printing할 때 정보를 읽기 쉬운 형식으로 표시하도록 합니다.main.lua: Book module을 Require하고, book instances를 Create한 다음 직접 Print하여 사용자 지정 문자열 형식이 동작하는 모습을 확인합니다.
__tostring method는 다음과 정확히 같은 형식의 문자열을 return해야 합니다:
"[title]" by [author]Output 문자열에서 title이 double quotes로 감싸져 있다는 점에 유의하세요.
네 개의 inputs를 받습니다:
- 첫 번째 책의 Title
- 첫 번째 책의 author
- 두 번째 책의 Title
- 두 번째 책의 author
main 파일에서 제공된 inputs를 사용하여 두 권의 책을 Create하고 각 책을 직접 Print하세요(method를 호출하지 말고, print(book)만 사용하세요). 각 책은 자체 줄에 표시되어야 합니다.
예를 들어 inputs가 The Hobbit, J.R.R. Tolkien, 1984, George Orwell이라면 Output은 다음과 같아야 합니다:
"The Hobbit" by J.R.R. Tolkien
"1984" by George Orwell__tostring은 문자열을 return해야 하며, class table이 instances의 metatable 역할을 하므로 책을 Print할 때 Lua가 자동으로 __tostring function을 찾아 사용한다는 점을 Remember하세요.
직접 해보기
-- Book 모듈 불러오기
local Book = require('Book')
-- 입력 읽기
local title1 = io.read()
local author1 = io.read()
local title2 = io.read()
local author2 = io.read()
-- TODO: Book:new()를 사용하여 두 개의 book 인스턴스 생성
-- TODO: 각 book을 직접 출력 (print(book)만 사용)
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러