Menu
CoddyTech

객체 더하기

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

이미 __tostring 및 __eq와 같은 메타메서드로 객체의 동작 방식을 사용자 지정할 수 있다는 것을 살펴봤습니다. 이제 덧셈부터 시작해 산술 연산으로 범위를 넓혀 보겠습니다.

__add 메타메서드는 두 객체 사이에 + 연산자를 사용할 때 어떤 일이 일어나는지 정의합니다. Lua는 a + b를 보면 두 피연산자 중 하나의 메타테이블에서 __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가 점 표기법으로 정의된다는 점에 주목하세요. Lua는 두 피연산자를 일반 인수로 전달하며, 점 표기법은 두 피연산자 모두에 이름을 지정합니다. function Vector:__add(other)는 function Vector.__add(self, other)와 같으므로 콜론 표기법도 사용할 수 있지만, 점 표기법이 관례입니다. __add는 원본 중 어느 것도 수정하는 대신 새 객체를 반환해야 합니다. 이렇게 하면 연산을 예측 가능하고 안전하게 유지할 수 있습니다.

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

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

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

challenge icon

챌린지

쉬움

+ 연산자를 사용해 덧셈을 지원하는 Vector 클래스를 만들어 봅시다. 이는 연산자 오버로딩을 처음 접하는 단계로, 객체가 Lua의 내장 연산자와 자연스럽게 작동하도록 합니다.

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

  • Vector.lua: x와 y 구성 요소를 가진 Vector 클래스를 정의합니다. :new(x, y) 생성자를 포함하고, 두 벡터를 더하면 구성 요소를 합친 새 벡터를 만들도록 __add 메타메서드를 구현합니다. 두 피연산자가 이름 있는 인수로 전달되도록 __add는 점 표기법으로 정의합니다.
  • main.lua: Vector 모듈을 불러오고, 벡터 인스턴스를 만든 다음, 벡터를 더하면 올바른 결과가 나오는지 확인합니다.

입력은 네 개입니다.

  1. 첫 번째 벡터의 x 구성 요소
  2. 첫 번째 벡터의 y 구성 요소
  3. 두 번째 벡터의 x 구성 요소
  4. 두 번째 벡터의 y 구성 요소

메인 파일에서 주어진 구성 요소로 벡터 두 개를 만들고, + 연산자를 사용해 두 벡터를 더한 다음, 결과 벡터의 x와 y 값을 각각 별도의 줄에 출력합니다.

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

4
6

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

직접 해보기

-- 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실력 점검

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

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

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