객체 빼기
Coddy Lua 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 70개 중 27번째.
__add가 + 연산자를 처리하는 것처럼, __sub 메타메서드는 - 연산자의 동작을 정의합니다. 패턴은 동일합니다. 두 피연산자를 받아 새 객체를 반환하는 함수를 정의합니다.
local Color = {}
Color.__index = Color
function Color:new(r, g, b)
local obj = {r = r, g = g, b = b}
setmetatable(obj, Color)
return obj
end
function Color.__sub(c1, c2)
return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
endRGB 색상을 다룰 때 뺄셈을 하면 음수 값이 나올 수 있습니다. 실제 애플리케이션에서는 결과를 유효한 범위(0-255)로 제한하고 싶을 수 있지만, 핵심 메타메서드 구조는 동일하게 유지됩니다.
local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim
print(result.r, result.g, result.b) -- 출력: 150 120 80기억하세요: __sub는 점을 사용해 정의하세요(콜론이 아니라). Lua가 두 피연산자를 모두 인수로 전달하여 직접 호출하는 메타메서드이기 때문입니다.
챌린지
쉬움Color 클래스를 만들어 - 연산자를 사용한 뺄셈을 지원해 봅시다. 색상은 RGB 값으로 표현되며, 한 색상에서 다른 색상을 빼면 각 구성 요소의 차이를 가진 새 색상이 만들어집니다.
코드를 두 파일로 나눠 작성합니다.
Color.lua: 빨간색, 초록색, 파란색 값을 나타내는r,g,b구성 요소가 있는 Color 클래스를 정의합니다.:new(r, g, b)생성자를 포함하고, 두 색상을 빼면 각 구성 요소의 차이를 가진 새 색상이 만들어지도록__sub메타메서드를 구현합니다.__sub는 점 표기법을 사용하며 두 피연산자를 모두 인수로 받는다는 점을 기억하세요.main.lua: Color 모듈을 불러오고, 주어진 입력으로 색상 인스턴스를 만든 다음, 두 색상을 빼고 결과 RGB 값을 출력합니다.
입력은 여섯 개입니다.
- 첫 번째 색상의 빨간색 구성 요소
- 첫 번째 색상의 초록색 구성 요소
- 첫 번째 색상의 파란색 구성 요소
- 두 번째 색상의 빨간색 구성 요소
- 두 번째 색상의 초록색 구성 요소
- 두 번째 색상의 파란색 구성 요소
메인 파일에서 주어진 RGB 값으로 색상 두 개를 만들고, - 연산자를 사용해 첫 번째 색상에서 두 번째 색상을 뺀 다음, 결과 색상의 r, g, b 값을 각각 별도의 줄에 출력합니다.
예를 들어 입력이 200, 150, 100, 50, 30, 20이면 출력은 다음과 같습니다.
150
120
80첫 번째 색상 (200, 150, 100)에서 두 번째 색상 (50, 30, 20)을 빼면 새 색상 (150, 120, 80)이 됩니다.
직접 해보기
-- Color 모듈을 불러오기
local Color = require('Color')
-- 입력값 읽기
local r1 = tonumber(io.read())
local g1 = tonumber(io.read())
local b1 = tonumber(io.read())
local r2 = tonumber(io.read())
local g2 = tonumber(io.read())
local b2 = tonumber(io.read())
-- TODO: 주어진 RGB 값으로 Color 인스턴스 두 개 만들기
-- TODO: - 연산자를 사용해 첫 번째 색상에서 두 번째 색상 빼기
-- TODO: 결과 색상의 r, g, b 값을 각각 별도의 줄에 출력하기
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러