Menu
Coddy logo textTech

객체 비교하기 (<, >)

Coddy Lua 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 70개 중 29번째.

산술 연산과 문자열 연결 외에도, 비교 메타메소드를 사용하여 객체들이 서로 어떻게 비교되는지 정의할 수 있습니다. __lt 메타메소드는 "미만"(<code><) 연산자를 처리합니다.

Lua가 a < b를 평가할 때, 메타테이블에서 __lt를 찾습니다. 이 메타메서드는 사용자의 비교 로직에 따라 true 또는 false를 반환해야 합니다.

local Item = {}
Item.__index = Item

function Item:new(name, price)
    local obj = {name = name, price = price}
    setmetatable(obj, Item)
    return obj
end

function Item.__lt(a, b)
    return a.price < b.price
end

__lt가 정의되었으므로, 이제 아이템을 직접 비교할 수 있습니다:

local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)

print(apple < laptop)   -- 출력: true
print(laptop < apple)   -- 출력: false

여기 기발한 부분이 있습니다: Lua는 __lt로부터 연산자를 자동으로 도출합니다. a > b라고 작성하면, Lua는 대신 단순히 b < a를 평가합니다. 따라서 __lt만 정의하면 두 가지 비교 방향을 모두 거저 얻게 됩니다.

challenge icon

챌린지

쉬움

가격을 기준으로 <code>< 및 연산자를 사용하여 비교할 수 있는 Product 클래스를 만들어 보겠습니다. 이는 쇼핑 카트의 항목을 정렬하거나 목록에서 가장 저렴한 옵션을 찾는 것과 같은 시나리오에 적합합니다.

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

  • Product.lua: nameprice 필드를 가진 Product 클래스를 정의합니다. :new(name, price) 생성자를 포함하고, 가격별로 제품을 비교하기 위해 __lt 메타메소드를 구현하세요. __lt를 정의하면 자동으로 연산자도 사용할 수 있게 된다는 점을 기억하세요. Lua가 이를 대신 처리해 줍니다!
  • main.lua: Product 모듈을 불러오고(require), 입력값으로 제품 인스턴스를 생성한 다음, 어느 제품의 가격이 더 비싸거나 싼지 비교합니다.

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

  1. 첫 번째 제품의 이름
  2. 첫 번째 제품의 가격
  3. 두 번째 제품의 이름
  4. 두 번째 제품의 가격

메인 파일에서 주어진 이름과 가격으로 두 개의 제품을 생성하세요. 그런 다음 세 가지 비교를 수행하고 각 결과를 별도의 줄에 출력하세요:

  1. 첫 번째 제품이 두 번째 제품보다 작은가? (true 또는 false 출력)
  2. 첫 번째 제품이 두 번째 제품보다 큰가? (true 또는 false 출력)
  3. 더 저렴한 제품의 이름을 출력하세요.

예를 들어, 입력값이 Apple, 2, Laptop, 999인 경우 출력은 다음과 같아야 합니다:

true
false
Apple

Apple(가격 2)은 Laptop(가격 999)보다 작으므로 첫 번째 비교는 true입니다. Apple은 Laptop보다 크지 않으므로 두 번째 비교는 false입니다. 그리고 Apple의 가격이 더 낮기 때문에 더 저렴한 제품으로 이름이 출력됩니다.

치트 시트

__lt 메타메소드는 사용자 정의 객체에 대한 "작음"(<code><) 연산자를 처리합니다.

Lua가 a < b를 평가할 때, 메타테이블에서 __lt를 찾습니다. 이 메타메소드는 비교 로직에 따라 true 또는 false를 반환해야 합니다.

local Item = {}
Item.__index = Item

function Item:new(name, price)
    local obj = {name = name, price = price}
    setmetatable(obj, Item)
    return obj
end

function Item.__lt(a, b)
    return a.price < b.price
end

__lt가 정의되면 아이템들을 직접 비교할 수 있습니다:

local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)

print(apple < laptop)   -- 출력: true
print(laptop < apple)   -- 출력: false

Lua는 __lt로부터 연산자를 자동으로 도출합니다. a > b를 작성하면 Lua는 대신 b < a를 평가합니다. __lt만 정의하면 두 가지 비교 방향을 모두 사용할 수 있습니다.

직접 해보기

-- Product 모듈 가져오기
local Product = require('Product')

-- 입력 읽기
local name1 = io.read()
local price1 = tonumber(io.read())
local name2 = io.read()
local price2 = tonumber(io.read())

-- TODO: Product:new()를 사용하여 두 개의 Product 인스턴스 생성

-- TODO: < 연산자를 사용하여 제품을 비교하고 true/false 출력

-- TODO: > 연산자를 사용하여 제품을 비교하고 true/false 출력

-- TODO: 더 저렴한 제품의 이름 출력
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨