Menu
CoddyTech

객체 연결하기

Coddy Lua 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 70개 중 28번째.

Lua의 .. 연산자는 문자열을 연결하지만, 객체와 문자열을 결합하려면 어떻게 해야 할까요? __concat 메타메서드를 사용하면 이 작업을 정확히 어떻게 처리할지 정의할 수 있습니다.

Lua가 a .. b를 만났을 때 피연산자 중 하나에 __concat 메타메서드가 있으면 두 값을 모두 해당 함수에 전달합니다. 객체가 문자열 표현식에 자연스럽게 어우러지도록 하고 싶을 때 유용합니다.

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
end

함수가 어느 피연산자가 문자열인지 확인하는 점에 주목하세요. ..는 "Hello " .. obj 또는 obj .. "!"처럼 사용할 수 있으므로, 메타메서드는 두 경우를 모두 처리해야 합니다.

local person = Name:new("Ada", "Lovelace")

print("Dr. " .. person)      -- 출력: Dr. Ada Lovelace
print(person .. " PhD")      -- 출력: Ada Lovelace PhD

다른 연산자 메타메서드와 마찬가지로 __concat은 관례상 점으로 표기하며 두 피연산자를 모두 인수로 받습니다. 산술 메타메서드와의 주요 차이점은 일반적으로 서로 다른 타입을 함께 다룬다는 것입니다. 객체와 문자열을 다룹니다.

challenge icon

챌린지

쉬움

.. 연산자를 사용하여 문자열 식에 자연스럽게 어울릴 수 있는 Title 클래스를 만들어 봅시다. 사람의 직함에 경칭이나 접미사를 붙이는 것처럼, 읽기 쉽고 직관적인 방식으로 객체와 문자열을 결합하고 싶을 때 유용합니다.

두 개의 파일에 코드를 나누어 작성합니다.

  • Title.lua: 직함 문자열을 저장하는 text 필드가 있는 Title 클래스를 정의합니다. :new(text) 생성자를 포함하고 __concat 메타메서드를 구현합니다. 메타메서드는 두 가지 경우, 즉 문자열이 객체 앞에 오는 경우("prefix" .. obj)와 문자열이 객체 뒤에 오는 경우(obj .. "suffix")를 모두 처리해야 합니다. 결과는 문자열과 직함의 텍스트를 적절한 순서로 결합해야 합니다.
  • main.lua: Title 모듈을 불러오고, 직함 인스턴스를 만든 다음, 양방향 연결을 보여 줍니다.

다음 세 가지 입력을 받습니다.

  1. 직함 텍스트(예: "Engineer")
  2. 직함 앞에 붙일 접두사 문자열(예: "Senior ")
  3. 직함 뒤에 붙일 접미사 문자열(예: " III")

메인 파일에서 주어진 텍스트로 Title을 만듭니다. 그런 다음 두 번 연결하고, 각 결과를 별도의 줄에 출력합니다.

  1. 접두사 문자열을 직함 객체와 연결합니다.
  2. 직함 객체를 접미사 문자열과 연결합니다.

예를 들어 입력이 Engineer, Senior , III이면 출력은 다음과 같습니다.

Senior Engineer
Engineer III

첫 번째 줄에는 접두사가 직함과 결합된 결과가 표시되고, 두 번째 줄에는 직함이 접미사와 결합된 결과가 표시됩니다. __concat 메타메서드를 사용하면 이처럼 자연스럽게 문자열을 결합할 수 있습니다!

직접 해보기

-- 입력을 읽습니다
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를 이어 붙이고 결과를 출력합니다
quiz icon실력 점검

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

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Lua 컴파일러