객체 비교하기 (<, >)
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만 정의하면 두 가지 비교 방향을 모두 거저 얻게 됩니다.
챌린지
쉬움가격을 기준으로 <code>< 및 연산자를 사용하여 비교할 수 있는 Product 클래스를 만들어 보겠습니다. 이는 쇼핑 카트의 항목을 정렬하거나 목록에서 가장 저렴한 옵션을 찾는 것과 같은 시나리오에 적합합니다.
코드는 두 개의 파일로 구성됩니다:
Product.lua:name및price필드를 가진 Product 클래스를 정의합니다.:new(name, price)생성자를 포함하고, 가격별로 제품을 비교하기 위해__lt메타메소드를 구현하세요.__lt를 정의하면 자동으로연산자도 사용할 수 있게 된다는 점을 기억하세요. Lua가 이를 대신 처리해 줍니다!main.lua: Product 모듈을 불러오고(require), 입력값으로 제품 인스턴스를 생성한 다음, 어느 제품의 가격이 더 비싸거나 싼지 비교합니다.
네 개의 입력값을 받게 됩니다:
- 첫 번째 제품의 이름
- 첫 번째 제품의 가격
- 두 번째 제품의 이름
- 두 번째 제품의 가격
메인 파일에서 주어진 이름과 가격으로 두 개의 제품을 생성하세요. 그런 다음 세 가지 비교를 수행하고 각 결과를 별도의 줄에 출력하세요:
- 첫 번째 제품이 두 번째 제품보다 작은가? (
true또는false출력) - 첫 번째 제품이 두 번째 제품보다 큰가? (
true또는false출력) - 더 저렴한 제품의 이름을 출력하세요.
예를 들어, 입력값이 Apple, 2, Laptop, 999인 경우 출력은 다음과 같아야 합니다:
true
false
AppleApple(가격 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) -- 출력: falseLua는 __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: 더 저렴한 제품의 이름 출력
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.