Menu
Coddy logo textTech

독립적인 인스턴스

Coddy Lua 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 70개 중 10번째.

객체 지향 프로그래밍의 중요한 측면은 각 인스턴스가 자신만의 독립된 상태를 유지한다는 것입니다. 같은 클래스에서 두 개의 객체를 생성할 때, 이들은 완전히 독립적입니다. 즉, 하나를 변경해도 다른 하나에는 영향을 미치지 않습니다.

다음 예시를 살펴보세요:

local Counter = {}
Counter.__index = Counter

function Counter:new(start)
    local instance = {}
    setmetatable(instance, self)
    instance.value = start or 0
    return instance
end

function Counter:increment()
    self.value = self.value + 1
end

-- 두 개의 별도 카운터 생성
local counterA = Counter:new(10)
local counterB = Counter:new(5)

counterA:increment()
counterA:increment()

print(counterA.value)  -- 출력: 12
print(counterB.value)  -- 출력: 5

두 카운터 모두 동일한 Counter 클래스에서 생성되었지만, counterA를 증가시켜도 counterB에는 아무런 영향을 미치지 않습니다. 각 객체는 자체 인스턴스 테이블에 저장된 고유한 value 필드를 가집니다.

이러한 독립성은 객체를 유용하게 만드는 요소입니다. 게임에서 수십 명의 플레이어를 생성할 수 있으며, 각 플레이어는 자신의 체력과 점수를 개별적으로 추적합니다. 또한 각기 다른 잔액을 가진 여러 개의 은행 계좌를 관리할 수도 있습니다.

클래스는 구조와 동작을 정의하지만, 각 인스턴스는 자신만의 데이터를 가지고 독립적으로 존재합니다.

challenge icon

챌린지

쉬움

동일한 클래스에서 생성된 객체들이 실제로 독립적인 상태를 유지하는지 증명해 봅시다! Wallet 클래스를 만들고 두 개의 별도 지갑 인스턴스를 생성한 다음, 한쪽의 변경 사항이 다른 쪽에 영향을 주지 않는다는 것을 보여주기 위해 각각 독립적으로 수정해 보겠습니다.

코드는 두 개의 파일로 구성됩니다:

  • Wallet.lua: 표준 생성자 패턴을 사용하여 Wallet 클래스를 정의합니다. 각 지갑은 고유한 balance를 추적해야 합니다. 다음을 포함하세요:
    • 주어진 금액으로 지갑을 초기화하는 :new(startingBalance) 생성자
    • 잔액을 증가시키는 :add(amount) 메서드
    • 잔액을 감소시키는 :spend(amount) 메서드
  • main.lua: Wallet 모듈을 불러오고(require) 두 개의 별도 지갑 인스턴스를 생성합니다. 각 인스턴스가 독립적인 상태를 유지함을 보여주기 위해 서로 다른 작업을 수행합니다.

네 개의 입력을 받게 됩니다:

  1. 지갑 A의 시작 잔액
  2. 지갑 B의 시작 잔액
  3. 지갑 A에 추가할 금액
  4. 지갑 B에서 사용할 금액

메인 파일에서 다음을 수행하세요:

  1. 첫 번째 시작 잔액으로 walletA를 생성합니다.
  2. 두 번째 시작 잔액으로 walletB를 생성합니다.
  3. 지정된 금액을 walletA에 추가합니다.
  4. 지정된 금액을 walletB에서 사용합니다.
  5. 두 잔액을 각각 별도의 줄에 출력합니다.

최종 잔액을 다음 형식으로 정확히 출력하세요:

Wallet A: [balance]
Wallet B: [balance]

예를 들어, 입력값이 100, 50, 25, 10인 경우 출력은 다음과 같아야 합니다:

Wallet A: 125
Wallet B: 40

지갑 A에 금액을 추가해도 지갑 B가 변하지 않고, 지갑 B에서 금액을 사용해도 지갑 A에 영향을 주지 않는 점에 주목하세요. 각 인스턴스는 자신만의 독립적인 잔액을 유지합니다.

치트 시트

클래스의 각 인스턴스는 고유한 별도의 상태를 유지합니다. 동일한 클래스에서 여러 객체를 생성하면 완전히 독립적인 인스턴스가 생성되며, 하나를 수정해도 다른 인스턴스에는 영향을 미치지 않습니다.

인스턴스 독립성을 보여주는 예시:

local Counter = {}
Counter.__index = Counter

function Counter:new(start)
    local instance = {}
    setmetatable(instance, self)
    instance.value = start or 0
    return instance
end

function Counter:increment()
    self.value = self.value + 1
end

-- 두 개의 별도 카운터 생성
local counterA = Counter:new(10)
local counterB = Counter:new(5)

counterA:increment()
counterA:increment()

print(counterA.value)  -- 출력: 12
print(counterB.value)  -- 출력: 5

각 객체는 자체 데이터를 저장하는 고유한 인스턴스 테이블을 가집니다. 클래스는 구조와 동작을 정의하지만, 각 인스턴스는 독립적인 상태를 유지합니다.

직접 해보기

-- Wallet 모듈 불러오기
local Wallet = require('Wallet')

-- 입력값 읽기
local startingA = tonumber(io.read())
local startingB = tonumber(io.read())
local addAmount = tonumber(io.read())
local spendAmount = tonumber(io.read())

-- TODO: 첫 번째 시작 잔액으로 walletA 생성

-- TODO: 두 번째 시작 잔액으로 walletB 생성

-- TODO: walletA에 지정된 금액 추가

-- TODO: walletB에서 지정된 금액 사용

-- TODO: 요구된 형식으로 최종 잔액 출력
-- 형식: "Wallet A: [balance]" 및 "Wallet B: [balance]"
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨