Menu
Coddy logo textTech

동등성 확인

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)

이 패턴은 객체가 고유 식별자를 가진 실제 세계의 개체를 나타낼 때 유용합니다. 데이터베이스 레코드, 게임 개체 또는 메모리 위치보다 정체성이 더 중요한 모든 객체를 비교할 때 사용할 수 있습니다.

challenge icon

챌린지

쉬움

완전히 다른 테이블에 저장되어 있더라도 두 제품이 same item인지 판단할 수 있는 Product class를 만들어 봅시다! 소매 시스템에서 제품에는 고유한 SKU 코드(Stock Keeping Units)가 있는 경우가 많으며, 가격 변경과 같은 다른 세부 정보와 관계없이 두 제품이 same SKU를 공유하면 equal로 간주해야 합니다.

코드를 두 파일에 나누어 구성합니다:

  • Product.lua: 표준 prototype pattern을 사용하여 Product class를 정의합니다. 각 제품은 sku(고유 식별자)와 name을 저장해야 합니다. 두 제품이 same SKU를 가질 때 equal로 간주되도록 __eq metamethod를 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하는 __eq metamethod

여섯 개의 inputs를 받습니다:

  1. 첫 번째 product의 SKU
  2. 첫 번째 product의 Name
  3. 두 번째 product의 SKU
  4. 두 번째 product의 Name
  5. 세 번째 product의 SKU
  6. 세 번째 product의 Name

main 파일에서 제공된 inputs를 사용하여 세 개의 products를 Create한 다음 다음을 Print합니다:

  1. 각 product의 info(세 줄)
  2. product 1과 product 2를 comparing한 result
  3. 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을 비교한 결과 출력
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨

직접 연습해 보세요: 온라인 Lua 컴파일러