Menu
Coddy logo textTech

객체 비교하기 (<, >)

Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 29번째.

산술 및 연결을 넘어, 비교 metamethods를 사용하여 객체가 서로 비교되는 방식을 정의할 수도 있습니다. __lt metamethod는 "미만" (<code><) operator를 처리합니다.

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에서 연산자를 automatically 도출합니다. a > b라고 작성하면 Lua는 대신 간단히 b < a를 평가합니다. 따라서 __lt만 정의해도 두 비교 방향을 무료로 사용할 수 있습니다.

challenge icon

챌린지

쉬움

Product class를 만들어 가격을 기준으로 <code>< 및 연산자를 사용해 비교할 수 있도록 해 봅시다. 쇼핑 카트의 항목을 정렬하거나 목록에서 가장 저렴한 옵션을 찾는 것과 같은 상황에 안성맞춤입니다.

코드를 두 개의 파일로 구성합니다:

  • Product.lua: nameprice fields를 사용해 Product class를 Define합니다. :new(name, price) Constructor를 포함하고, 가격으로 products를 compare하도록 __lt metamethod를 Implement합니다. __lt를 Define하면 operator도 automatically 사용할 수 있다는 점을 기억하세요. Lua가 이를 대신 처리해 줍니다!
  • main.lua: Product module을 Require하고, inputs에서 product instances를 Create한 다음 어느 쪽이 더 비싸거나 저렴한지 결정하도록 비교합니다.

네 개의 inputs를 받습니다:

  1. 첫 번째 product의 name
  2. 첫 번째 product의 price
  3. 두 번째 product의 name
  4. 두 번째 product의 price

main 파일에서 주어진 names와 prices로 두 개의 products를 Create합니다. 그런 다음 세 번 compare하고 각 결과를 별도의 줄에 Print합니다:

  1. 첫 번째 product가 두 번째 product보다 less한가요? (true 또는 false를 Print)
  2. 첫 번째 product가 두 번째 product보다 greater한가요? (true 또는 false를 Print)
  3. 더 저렴한 product의 name을 Print

예를 들어 inputs가 Apple, 2, Laptop, 999라면 Output은 다음과 같아야 합니다:

true
false
Apple

Apple(price 2)은 Laptop(price 999)보다 less하므로 첫 번째 비교 결과는 true입니다. Apple은 Laptop보다 greater하지 않으므로 두 번째 결과는 false입니다. 그리고 Apple의 price가 더 낮으므로 더 저렴한 product로 Print됩니다.

직접 해보기

-- 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)의 모든 레슨

직접 연습해 보세요: 온라인 Lua 컴파일러