산술 메타메소드 파트 1
Coddy Lua 여정의 Logic & Flow 섹션에 포함된 레슨 — 54개 중 21번째.
__tostring을 사용하여 테이블을 출력할 때 어떤 일이 일어나는지 사용자 정의하는 방법을 배웠습니다. 이제 메타테이블이 테이블에 + 및 -와 같은 산술 연산자를 사용할 때 어떤 일이 일어나는지도 정의할 수 있다는 것을 알게 될 것입니다.
보통 + 연산자를 사용하여 두 개의 테이블을 더하려고 하면, Lua는 테이블을 더하는 방법을 모르기 때문에 에러를 발생시킵니다. 하지만 산술 메타메소드(arithmetic metamethods)를 사용하면, 사용자 정의 데이터 타입에 대해 덧셈이 정확히 무엇을 의미하는지 정의할 수 있습니다.
__add 메타메서드는 덧셈 동작을 제어합니다. Lua가 두 값 사이에서 + 연산자를 만나고 그 중 적어도 하나가 __add를 포함한 메타테이블을 가지고 있을 때, 오류를 발생시키는 대신 해당 함수를 호출합니다:
local v1 = {x = 3, y = 4}
local v2 = {x = 1, y = 2}
local meta = {
__add = function(a, b)
return {x = a.x + b.x, y = a.y + b.y}
end
}
setmetatable(v1, meta)
setmetatable(v2, meta)
local v3 = v1 + v2
print(v3.x, v3.y) -- 출력: 4 6__add 함수는 왼쪽 피연산자와 오른쪽 피연산자라는 두 개의 인자를 받습니다. 이 예제에서는 두 입력 테이블의 대응하는 값들의 합인 x와 y 값을 가진 새로운 테이블을 생성합니다.
마찬가지로, __sub 메타메소드는 - 연산자를 사용한 뺄셈을 제어합니다:
local meta = {
__sub = function(a, b)
return {x = a.x - b.x, y = a.y - b.y}
end
}
setmetatable(v1, meta)
setmetatable(v2, meta)
local v3 = v1 - v2
print(v3.x, v3.y) -- 출력: 2 2사용자 정의 연산자 동작을 정의하는 이러한 능력은 연산자 오버로딩이라고 불립니다.
챌린지
쉬움x1, y1, x2, y2를 인자로 받아 두 벡터를 더한 결과를 반환하는 addVectors 함수를 작성하세요.
주어진 좌표로 두 개의 벡터 테이블을 생성하고, 벡터 덧셈을 가능하게 하는 __add 메타메소드가 포함된 메타테이블을 연결한 뒤, + 연산자를 사용하여 더하고 그 결과를 형식화된 문자열로 반환하세요.
로직:
- 키가
x = x1및y = y1인 첫 번째 벡터 테이블을 생성합니다. - 키가
x = x2및y = y2인 두 번째 벡터 테이블을 생성합니다. - 두 벡터를 받아
x = a.x + b.x및y = a.y + b.y인 새 테이블을 반환하는__add가 포함된 메타테이블을 생성합니다. setmetatable()을 사용하여 두 벡터 테이블 모두에 메타테이블을 연결합니다.v1 + v2를 사용하여 두 벡터를 더합니다.- 결과를
"x y"형식(x와 y 값이 공백으로 구분됨)의 문자열로 반환합니다.
매개변수:
x1(number): 첫 번째 벡터의 x 좌표y1(number): 첫 번째 벡터의 y 좌표x2(number): 두 번째 벡터의 x 좌표y2(number): 두 번째 벡터의 y 좌표
반환값: 두 벡터의 합을 "x y" 형식의 문자열로 반환 (string)
치트 시트
메타테이블은 테이블에 + 및 -와 같은 산술 연산자를 사용할 때 발생하는 동작을 정의할 수 있습니다. 이를 연산자 오버로딩이라고 합니다.
__add 메타메소드는 + 연산자를 사용한 덧셈 동작을 제어합니다:
local v1 = {x = 3, y = 4}
local v2 = {x = 1, y = 2}
local meta = {
__add = function(a, b)
return {x = a.x + b.x, y = a.y + b.y}
end
}
setmetatable(v1, meta)
setmetatable(v2, meta)
local v3 = v1 + v2
print(v3.x, v3.y) -- 출력: 4 6__add 함수는 왼쪽 피연산자와 오른쪽 피연산자라는 두 개의 인수를 받습니다.
__sub 메타메소드는 - 연산자를 사용한 뺄셈을 제어합니다:
local meta = {
__sub = function(a, b)
return {x = a.x - b.x, y = a.y - b.y}
end
}
setmetatable(v1, meta)
setmetatable(v2, meta)
local v3 = v1 - v2
print(v3.x, v3.y) -- 출력: 2 2직접 해보기
function addVectors(x1, y1, x2, y2)
-- 여기에 코드를 작성하세요
end
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.