Menu
CoddyTech

객체 비교하기 (<, >)

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

산술과 연결을 넘어, 비교 메타메서드를 사용하여 객체들이 서로 비교되는 방식을 정의할 수도 있습니다. __lt 메타메서드는 "보다 작음"(<) 연산자를 처리합니다.

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

챌린지

쉬움

가격을 기준으로 Product 클래스를 < 및 > 연산자를 사용해 비교할 수 있도록 만들어 봅시다. 이는 장바구니의 항목을 정렬하거나 목록에서 가장 저렴한 옵션을 찾는 것과 같은 상황에 매우 유용합니다.

코드를 두 개의 파일로 나누어 작성합니다.

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

네 개의 입력을 받습니다.

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

main 파일에서 주어진 이름과 가격으로 두 상품을 생성합니다. 그런 다음 세 번 비교하고 각 결과를 별도의 줄에 출력합니다.

  1. 첫 번째 상품이 두 번째 상품보다 저렴한가요? (true 또는 false 출력)
  2. 첫 번째 상품이 두 번째 상품보다 비싼가요? (true 또는 false 출력)
  3. 더 저렴한 상품의 이름 출력

예를 들어 입력이 Apple, 2, Laptop, 999라면 출력은 다음과 같습니다.

true
false
Apple

Apple의 가격(2)이 Laptop의 가격(999)보다 낮으므로 첫 번째 비교 결과는 true입니다. Apple은 Laptop보다 비싸지 않으므로 두 번째 결과는 false입니다. 또한 Apple의 가격이 더 낮기 때문에 더 저렴한 상품으로 출력됩니다.

직접 해보기

-- 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 컴파일러