Menu
Coddy logo textTech

객체 더하기

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

이미 __tostring__eq와 같은 메타메서드를 사용하여 객체의 동작 방식을 사용자 지정하는 방법을 살펴보았습니다. 이제 덧셈부터 시작하여 이를 산술 연산으로 확장해 보겠습니다.

__add metamethod는 두 객체 사이에서 + operator를 사용할 때 어떤 일이 발생하는지 정의합니다. Lua가 a + b를 보면 두 operands 중 하나의 metatable에서 __add를 찾습니다.

local Vector = {}
Vector.__index = Vector

function Vector:new(x, y)
    local obj = {x = x, y = y}
    setmetatable(obj, Vector)
    return obj
end

function Vector.__add(v1, v2)
    return Vector:new(v1.x + v2.x, v1.y + v2.y)
end

__add가 콜론이 아니라 dot으로 정의된다는 점에 주목하세요. 이 함수는 두 operands를 인수로 both 받으며, 원본 중 어느 것도 수정하지 않고 new object를 반환해야 should 합니다. 이렇게 하면 연산을 예측 가능하고 안전하게 유지할 수 있습니다.

local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b

print(c.x, c.y)  -- 출력: 4  6

핵심은 __add가 객체에만 있는 것이 아니라 metatable 자체(여기서는 Vector)에 있어야 한다는 것입니다. Vector를 모든 instances의 metatable로 설정했으므로, 모든 instances가 이 동작을 자동으로 공유합니다.

challenge icon

챌린지

쉬움

+ 연산자를 사용한 덧셈을 지원하는 Vector class를 만들어 봅시다. 이는 연산자 overloading을 처음 경험하는 단계로, 객체가 Lua의 내장 연산자와 자연스럽게 작동하도록 합니다.

코드를 두 개의 파일로 구성합니다:

  • Vector.lua: xy components를 사용하는 Vector class를 정의합니다. :new(x, y) constructor를 포함하고, 두 벡터를 더하면 combined components를 가진 새 벡터가 생성되도록 __add metamethod를 구현합니다. __add는 dot syntax(콜론이 아님)를 사용하며 두 operands를 arguments로 받는다는 점을 Remember하세요.
  • main.lua: Vector module을 Require하고, vector instances를 create한 다음, 이들을 더하면 올바른 result가 생성되는지 보여 줍니다.

네 개의 입력을 받습니다:

  1. 첫 번째 vector의 x component
  2. 첫 번째 vector의 y component
  3. 두 번째 vector의 x component
  4. 두 번째 vector의 y component

main 파일에서 주어진 components로 두 벡터를 create하고, + operator를 사용하여 함께 더한 다음, resulting vector의 xy 값을 separate lines에 Print합니다.

예를 들어 입력이 3, 4, 1, 2라면 출력은 다음과 같아야 합니다:

4
6

첫 번째 벡터 (3, 4)에 두 번째 벡터 (1, 2)를 더하면 새로운 벡터 (4, 6)가 result로 나옵니다.

직접 해보기

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

-- 입력을 읽습니다
local x1 = tonumber(io.read())
local y1 = tonumber(io.read())
local x2 = tonumber(io.read())
local y2 = tonumber(io.read())

-- TODO: 입력 값을 사용하여 두 개의 Vector 인스턴스를 생성합니다

-- TODO: + 연산자를 사용하여 두 벡터를 더합니다

-- TODO: 결과 벡터의 x와 y 값을 별도의 줄에 출력합니다
quiz icon실력 점검

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

객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨

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