동등성 확인
Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 17번째.
__tostring이 객체를 표시하는 방식을 제어하는 방법을 살펴보았습니다. 또 다른 유용한 메타메서드는 __eq이며, == 연산자를 사용하여 두 객체를 언제 같다고 간주할지 정의합니다.
기본적으로 ==을 사용하여 두 테이블을 비교하면 메모리에서 정확히 동일한 테이블인지 확인합니다. 동일한 데이터를 가진 서로 다른 두 객체는 false를 반환합니다:
local user1 = {id = 101, name = "Alice"}
local user2 = {id = 101, name = "Alice"}
print(user1 == user2) -- 출력: false (서로 다른 테이블)__eq를 사용하면 고유한 동등성 로직을 정의할 수 있습니다. 클래스에서는 __tostring과 마찬가지로 클래스 테이블의 함수로 추가합니다. 동등성이 작동하려면 두 객체가 동일한 메타테이블을 공유해야 합니다:
local User = {}
User.__index = User
function User:new(id, name)
local instance = {}
setmetatable(instance, self)
instance.id = id
instance.name = name
return instance
end
function User:__eq(other)
return self.id == other.id
end이제 두 User 객체는 다른 필드와 관계없이 동일한 ID를 공유하면 equal로 간주됩니다.
local u1 = User:new(101, "Alice")
local u2 = User:new(101, "Bob")
local u3 = User:new(202, "Alice")
print(u1 == u2) -- 출력: true (같은 ID)
print(u1 == u3) -- 출력: false (다른 ID)이 패턴은 객체가 고유 식별자를 가진 실제 세계의 개체를 나타낼 때 유용합니다. 데이터베이스 레코드, 게임 개체 또는 메모리 위치보다 정체성이 더 중요한 모든 객체를 비교할 때 사용할 수 있습니다.
챌린지
쉬움완전히 다른 테이블에 저장되어 있더라도 두 제품이 same item인지 판단할 수 있는 Product class를 만들어 봅시다! 소매 시스템에서 제품에는 고유한 SKU 코드(Stock Keeping Units)가 있는 경우가 많으며, 가격 변경과 같은 다른 세부 정보와 관계없이 두 제품이 same SKU를 공유하면 equal로 간주해야 합니다.
코드를 두 파일에 나누어 구성합니다:
Product.lua: 표준 prototype pattern을 사용하여Productclass를 정의합니다. 각 제품은sku(고유 식별자)와name을 저장해야 합니다. 두 제품이 same SKU를 가질 때 equal로 간주되도록__eqmetamethod를 Implement합니다. equality에서는 name이 중요하지 않습니다.main.lua: Product module을 Require하고 여러 제품 instances를 생성합니다.==연산자를 사용하여 비교하고, 사용자 지정 equality logic이 작동하는 모습을 확인합니다.
Product class에는 다음이 포함되어야 합니다:
:new(sku, name)constructor:getInfo()method: 다음 format의 string을 Return합니다:[sku]: [name]- SKU를 기준으로 products를 comparing하는
__eqmetamethod
여섯 개의 inputs를 받습니다:
- 첫 번째 product의 SKU
- 첫 번째 product의 Name
- 두 번째 product의 SKU
- 두 번째 product의 Name
- 세 번째 product의 SKU
- 세 번째 product의 Name
main 파일에서 제공된 inputs를 사용하여 세 개의 products를 Create한 다음 다음을 Print합니다:
- 각 product의 info(세 줄)
- product 1과 product 2를 comparing한 result
- product 1과 product 3을 comparing한 result
예를 들어 inputs가 ABC123, Wireless Mouse, ABC123, Mouse (Updated), XYZ789, Keyboard라면 Output은 다음과 같아야 합니다:
ABC123: Wireless Mouse
ABC123: Mouse (Updated)
XYZ789: Keyboard
true
false처음 두 products는 name이 다르더라도 same SKU이므로 equal이라는 점에 주목하세요. 이것이 실제 inventory systems가 name changes와 updates를 거쳐 products를 추적하는 정확한 방식입니다!
직접 해보기
-- Product 모듈 불러오기
local Product = require('Product')
-- 입력 읽기
local sku1 = io.read()
local name1 = io.read()
local sku2 = io.read()
local name2 = io.read()
local sku3 = io.read()
local name3 = io.read()
-- TODO: 입력을 사용하여 세 개의 Product 인스턴스 생성
-- TODO: 각 제품의 정보 출력 (세 줄)
-- TODO: product 1과 product 2를 비교한 결과 출력
-- TODO: product 1과 product 3을 비교한 결과 출력
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러