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를 사용하면 자신만의 동등성(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)이 더 중요한 모든 객체를 비교할 때 유용합니다.

challenge icon

챌린지

쉬움

두 제품이 서로 다른 테이블에 저장되어 있더라도 동일한 품목인지 확인할 수 있는 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 메타메소드

여섯 개의 입력을 받게 됩니다:

  1. 첫 번째 제품의 SKU
  2. 첫 번째 제품의 이름
  3. 두 번째 제품의 SKU
  4. 두 번째 제품의 이름
  5. 세 번째 제품의 SKU
  6. 세 번째 제품의 이름

메인 파일에서 제공된 입력을 사용하여 세 개의 제품을 생성한 후 다음을 출력하세요:

  1. 각 제품의 정보 (세 줄)
  2. 제품 1과 제품 2를 비교한 결과
  3. 제품 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의 비교 결과 출력
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨