Menu
Coddy logo textTech

객체 빼기

Coddy Lua 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 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)
end

RGB 색상을 다룰 때, 뺄셈은 음수 값을 생성할 수 있습니다. 실제 애플리케이션에서는 결과를 유효한 범위(0-255)로 제한(clamp)하고 싶을 수도 있지만, 핵심 메타메소드(metamethod) 구조는 동일하게 유지됩니다.

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가 두 피연산자를 인수로 사용하여 직접 호출하는 메타메소드이므로, 콜론이 아닌 점(.)으로 정의해야 합니다.

challenge icon

챌린지

쉬움

- 연산자를 사용하여 뺄셈을 지원하는 Color 클래스를 만들어 봅시다. 색상은 RGB 값으로 표현되며, 한 색상에서 다른 색상을 빼면 각 성분의 차이로 새로운 색상이 생성됩니다.

코드는 두 개의 파일로 구성됩니다:

  • Color.lua: 빨강, 초록, 파랑 값을 나타내는 r, g, b 성분을 가진 Color 클래스를 정의합니다. :new(r, g, b) 생성자를 포함하고, 두 색상을 뺐을 때 각 성분별 차이를 가진 새로운 색상이 생성되도록 __sub 메타메소드를 구현하세요. __sub는 점(dot) 구문을 사용하며 두 피연산자를 인자로 받는다는 점을 기억하세요.
  • main.lua: Color 모듈을 불러오고(require), 제공된 입력값으로 색상 인스턴스를 생성한 뒤, 이를 빼고 결과 RGB 값을 표시합니다.

여섯 개의 입력값을 받게 됩니다:

  1. 첫 번째 색상의 빨강(red) 성분
  2. 첫 번째 색상의 초록(green) 성분
  3. 첫 번째 색상의 파랑(blue) 성분
  4. 두 번째 색상의 빨강(red) 성분
  5. 두 번째 색상의 초록(green) 성분
  6. 두 번째 색상의 파랑(blue) 성분

메인 파일에서 주어진 RGB 값으로 두 개의 색상을 생성하고, - 연산자를 사용하여 첫 번째 색상에서 두 번째 색상을 뺀 후, 결과 색상의 r, g, b 값을 각각 별도의 줄에 출력하세요.

예를 들어, 입력값이 200, 150, 100, 50, 30, 20인 경우 출력은 다음과 같아야 합니다:

150
120
80

첫 번째 색상 (200, 150, 100)에서 두 번째 색상 (50, 30, 20)을 빼면 새로운 색상 (150, 120, 80)이 됩니다.

치트 시트

__sub 메타메소드는 - 연산자의 동작을 정의합니다. 두 개의 피연산자를 받아 새로운 객체를 반환합니다.

function Color.__sub(c1, c2)
    return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
end

Lua가 두 피연산자를 인자로 직접 호출하는 메타메소드이므로, 콜론이 아닌 점(dot)을 사용하여 __sub를 정의하세요.

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

직접 해보기

-- 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 값을 각각 별도의 줄에 출력합니다
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨