객체 비교하기 (<, >)
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만 정의해도 두 비교 방향을 무료로 사용할 수 있습니다.
챌린지
쉬움Product class를 만들어 가격을 기준으로 <code>< 및 연산자를 사용해 비교할 수 있도록 해 봅시다. 쇼핑 카트의 항목을 정렬하거나 목록에서 가장 저렴한 옵션을 찾는 것과 같은 상황에 안성맞춤입니다.
코드를 두 개의 파일로 구성합니다:
Product.lua:name및pricefields를 사용해 Product class를 Define합니다.:new(name, price)Constructor를 포함하고, 가격으로 products를 compare하도록__ltmetamethod를 Implement합니다.__lt를 Define하면operator도 automatically 사용할 수 있다는 점을 기억하세요. Lua가 이를 대신 처리해 줍니다!main.lua: Product module을 Require하고, inputs에서 product instances를 Create한 다음 어느 쪽이 더 비싸거나 저렴한지 결정하도록 비교합니다.
네 개의 inputs를 받습니다:
- 첫 번째 product의 name
- 첫 번째 product의 price
- 두 번째 product의 name
- 두 번째 product의 price
main 파일에서 주어진 names와 prices로 두 개의 products를 Create합니다. 그런 다음 세 번 compare하고 각 결과를 별도의 줄에 Print합니다:
- 첫 번째 product가 두 번째 product보다 less한가요? (
true또는false를 Print) - 첫 번째 product가 두 번째 product보다 greater한가요? (
true또는false를 Print) - 더 저렴한 product의 name을 Print
예를 들어 inputs가 Apple, 2, Laptop, 999라면 Output은 다음과 같아야 합니다:
true
false
AppleApple(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: 더 저렴한 제품의 이름 출력
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러