객체 연결하기
Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 28번째.
Lua의 .. 연산자는 문자열을 연결하지만, 객체와 문자열을 결합하려면 어떻게 해야 할까요? __concat 메타메서드를 사용하면 이 작업이 정확히 어떻게 이루어져야 하는지 정의할 수 있습니다.
Lua가 a .. b를 만나고 한 operand에 __concat metamethod가 있으면, 두 값을 모두 인수로 하여 해당 함수를 호출합니다. 이는 객체가 문자열 표현식에 자연스럽게 어우러지도록 하려는 경우에 유용합니다.
local Name = {}
Name.__index = Name
function Name:new(first, last)
local obj = {first = first, last = last}
setmetatable(obj, Name)
return obj
end
function Name.__concat(a, b)
if type(a) == "string" then
return a .. b.first .. " " .. b.last
else
return a.first .. " " .. a.last .. b
end
endfunction이 어떤 operand가 string인지 확인하는 것에 주목하세요. ..는 "Hello " .. obj 또는 obj .. "!"로 사용할 수 있으므로, metamethod는 both cases를 처리해야 합니다.
local person = Name:new("Ada", "Lovelace")
print("Dr. " .. person) -- 출력: Dr. Ada Lovelace
print(person .. " PhD") -- 출력: Ada Lovelace PhD다른 연산자 메타메서드와 마찬가지로 __concat은 점 표기법을 사용하며 both operand를 인수로 받습니다. 산술 메타메서드와의 주요 차이점은 일반적으로 혼합된 타입을 다룬다는 것입니다. 바로 object와 string입니다.
챌린지
쉬움.. 연산자를 사용해 문자열 표현식에 자연스럽게 어울릴 수 있는 Title class를 만들어 보겠습니다. 이는 사람의 직함에 경칭이나 접미사를 추가하는 것처럼, 객체와 문자열을 읽기 쉽고 직관적인 방식으로 결합하고 싶을 때 유용합니다.
코드는 두 파일에 나누어 작성합니다:
Title.lua:textfield에 직함 string을 저장하는 Title class를 Define하세요.:new(text)Constructor를 포함하고__concatmetamethod를 Implement하세요. metamethod는 두 cases를 모두 handle해야 합니다. string이 object 앞에 오는 경우("prefix" .. obj)와 string이 뒤에 오는 경우(obj .. "suffix")입니다. result는 string과 직함의 text를 적절하게 결합해야 합니다.main.lua: Title module을 Require하고, title instance를 Create한 다음, 양방향의 Concatenate를 보여 주세요.
세 개의 inputs를 받습니다:
- 직함 text(예: "Engineer")
- 직함 앞에 배치할 prefix string(예: "Senior ")
- 직함 뒤에 배치할 suffix string(예: " III")
main 파일에서 주어진 text로 Title을 Create하세요. 그런 다음 두 번 Concatenate하고 각 result를 별도의 줄에 print하세요:
- prefix string을 title object와 Concatenate
- title object를 suffix string과 Concatenate
예를 들어 inputs가 Engineer, Senior , III라면 Output은 다음과 같습니다:
Senior Engineer
Engineer III첫 번째 줄은 prefix와 title이 결합된 결과를, 두 번째 줄은 title과 suffix가 결합된 결과를 보여 줍니다. __concat metamethod가 이러한 자연스러운 string 결합을 가능하게 합니다!
직접 해보기
-- 입력 읽기
local titleText = io.read()
local prefix = io.read()
local suffix = io.read()
-- Title 모듈 불러오기
local Title = require('Title')
-- TODO: 주어진 titleText로 Title 인스턴스 생성
-- TODO: prefix를 title 객체와 연결하고 결과 출력
-- TODO: title 객체를 suffix와 연결하고 결과 출력
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러