독립적인 인스턴스
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 필드를 가집니다.
이러한 독립성은 객체를 유용하게 만드는 요소입니다. 게임에서 수십 명의 플레이어를 생성할 수 있으며, 각 플레이어는 자신의 체력과 점수를 개별적으로 추적합니다. 또한 각기 다른 잔액을 가진 여러 개의 은행 계좌를 관리할 수도 있습니다.
클래스는 구조와 동작을 정의하지만, 각 인스턴스는 자신만의 데이터를 가지고 독립적으로 존재합니다.
챌린지
쉬움동일한 클래스에서 생성된 객체들이 실제로 독립적인 상태를 유지하는지 증명해 봅시다! Wallet 클래스를 만들고 두 개의 별도 지갑 인스턴스를 생성한 다음, 한쪽의 변경 사항이 다른 쪽에 영향을 주지 않는다는 것을 보여주기 위해 각각 독립적으로 수정해 보겠습니다.
코드는 두 개의 파일로 구성됩니다:
Wallet.lua: 표준 생성자 패턴을 사용하여Wallet클래스를 정의합니다. 각 지갑은 고유한balance를 추적해야 합니다. 다음을 포함하세요:- 주어진 금액으로 지갑을 초기화하는
:new(startingBalance)생성자 - 잔액을 증가시키는
:add(amount)메서드 - 잔액을 감소시키는
:spend(amount)메서드
- 주어진 금액으로 지갑을 초기화하는
main.lua: Wallet 모듈을 불러오고(require) 두 개의 별도 지갑 인스턴스를 생성합니다. 각 인스턴스가 독립적인 상태를 유지함을 보여주기 위해 서로 다른 작업을 수행합니다.
네 개의 입력을 받게 됩니다:
- 지갑 A의 시작 잔액
- 지갑 B의 시작 잔액
- 지갑 A에 추가할 금액
- 지갑 B에서 사용할 금액
메인 파일에서 다음을 수행하세요:
- 첫 번째 시작 잔액으로
walletA를 생성합니다. - 두 번째 시작 잔액으로
walletB를 생성합니다. - 지정된 금액을
walletA에 추가합니다. - 지정된 금액을
walletB에서 사용합니다. - 두 잔액을 각각 별도의 줄에 출력합니다.
최종 잔액을 다음 형식으로 정확히 출력하세요:
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]"
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.