객체 더하기
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가 이 동작을 자동으로 공유합니다.
챌린지
쉬움+ 연산자를 사용한 덧셈을 지원하는 Vector class를 만들어 봅시다. 이는 연산자 overloading을 처음 경험하는 단계로, 객체가 Lua의 내장 연산자와 자연스럽게 작동하도록 합니다.
코드를 두 개의 파일로 구성합니다:
Vector.lua:x및ycomponents를 사용하는 Vector class를 정의합니다.:new(x, y)constructor를 포함하고, 두 벡터를 더하면 combined components를 가진 새 벡터가 생성되도록__addmetamethod를 구현합니다.__add는 dot syntax(콜론이 아님)를 사용하며 두 operands를 arguments로 받는다는 점을 Remember하세요.main.lua: Vector module을 Require하고, vector instances를 create한 다음, 이들을 더하면 올바른 result가 생성되는지 보여 줍니다.
네 개의 입력을 받습니다:
- 첫 번째 vector의 x component
- 첫 번째 vector의 y component
- 두 번째 vector의 x component
- 두 번째 vector의 y component
main 파일에서 주어진 components로 두 벡터를 create하고, + operator를 사용하여 함께 더한 다음, resulting vector의 x 및 y 값을 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 값을 별도의 줄에 출력합니다
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러