동등성 확인
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를 사용하면 자신만의 동등성(equality) 로직을 정의할 수 있습니다. 클래스에서 __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를 공유한다면 동일한 것으로 간주됩니다:
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)이 패턴은 객체가 고유 식별자를 가진 실제 세계의 엔티티를 나타낼 때 유용합니다. 데이터베이스 레코드, 게임 엔티티 또는 메모리 위치보다 식별성(identity)이 더 중요한 모든 객체를 비교할 때 유용합니다.
챌린지
쉬움두 제품이 서로 다른 테이블에 저장되어 있더라도 동일한 품목인지 확인할 수 있는 Product 클래스를 만들어 봅시다! 소매 시스템에서 제품은 종종 고유한 SKU 코드(Stock Keeping Unit, 재고 관리 코드)를 가지며, 가격 변경과 같은 다른 세부 사항에 관계없이 SKU가 동일하면 두 제품은 동일한 것으로 간주되어야 합니다.
코드는 두 개의 파일로 구성됩니다:
Product.lua: 표준 프로토타입 패턴을 사용하여Product클래스를 정의합니다. 각 제품은sku(고유 식별자)와name을 저장해야 합니다. 두 제품의 SKU가 같으면 동일한 것으로 간주되도록__eq메타메소드를 구현하세요. 이때 이름은 같지 않아도 상관없습니다.main.lua: Product 모듈을 불러와서 여러 제품 인스턴스를 생성합니다.==연산자를 사용하여 제품들을 비교하고 사용자 정의 등가 로직이 작동하는지 확인하세요.
Product 클래스에는 다음이 포함되어야 합니다:
:new(sku, name)생성자[sku]: [name]형식의 문자열을 반환하는:getInfo()메서드- SKU를 기준으로 제품을 비교하는
__eq메타메소드
여섯 개의 입력을 받게 됩니다:
- 첫 번째 제품의 SKU
- 첫 번째 제품의 이름
- 두 번째 제품의 SKU
- 두 번째 제품의 이름
- 세 번째 제품의 SKU
- 세 번째 제품의 이름
메인 파일에서 제공된 입력을 사용하여 세 개의 제품을 생성한 후 다음을 출력하세요:
- 각 제품의 정보 (세 줄)
- 제품 1과 제품 2를 비교한 결과
- 제품 1과 제품 3을 비교한 결과
예를 들어, 입력값이 ABC123, Wireless Mouse, ABC123, Mouse (Updated), XYZ789, Keyboard인 경우 출력은 다음과 같아야 합니다:
ABC123: Wireless Mouse
ABC123: Mouse (Updated)
XYZ789: Keyboard
true
false이름이 다르더라도 처음 두 제품이 동일(같은 SKU)하게 처리되는 방식에 주목하세요. 이것이 바로 실제 재고 시스템이 이름 변경이나 업데이트 과정에서 제품을 추적하는 방식입니다!
치트 시트
__eq 메타메소드는 == 연산자를 사용하여 객체에 대한 사용자 정의 동등성 로직을 정의합니다.
기본적으로 두 테이블을 비교하면 메모리상에서 동일한 테이블인지 확인합니다:
local user1 = {id = 101, name = "Alice"}
local user2 = {id = 101, name = "Alice"}
print(user1 == user2) -- Output: false (different tables)사용자 정의 동등성을 정의하려면 클래스 테이블에 __eq를 함수로 추가하세요. 두 객체는 반드시 동일한 메타테이블을 공유해야 합니다:
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이제 객체들은 사용자 정의 로직에 따라 동등해집니다:
local u1 = User:new(101, "Alice")
local u2 = User:new(101, "Bob")
local u3 = User:new(202, "Alice")
print(u1 == u2) -- Output: true (same ID)
print(u1 == u3) -- Output: false (different IDs)직접 해보기
-- 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: 제품 1과 제품 2의 비교 결과 출력
-- TODO: 제품 1과 제품 3의 비교 결과 출력
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.