독립적인 인스턴스
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 필드를 가지고 있습니다.
이러한 독립성이 객체를 유용하게 만듭니다. 게임에서 수십 명의 플레이어를 만들고, 각 플레이어가 자신의 체력과 점수를 추적하도록 할 수 있습니다. 여러 개의 은행 계좌를 관리할 수도 있으며, 각 계좌는 서로 다른 잔액을 가집니다.
class는 구조와 동작을 정의하지만, 각 instance는 its 고유한 데이터와 함께 자신만의 삶을 살아갑니다.
챌린지
쉬움같은 클래스의 객체들이 정말로 서로 독립적으로 동작한다는 것을 증명해 보자! Wallet 클래스를 만들고 두 개의 별도 wallet 인스턴스를 생성한 다음, 한쪽의 변경 사항이 다른 쪽에 영향을 주지 않는다는 것을 보여 주기 위해 각각을 독립적으로 수정할 것이다.
코드는 두 개의 파일로 구성한다:
Wallet.lua: 표준 생성자 패턴을 사용하여Wallet클래스를 Define한다. 각 wallet은 자신의balance를 추적해야 한다. 다음을 포함한다::new(startingBalance)constructor: 주어진 amount로 wallet을 초기화:add(amount)method: balance를 증가:spend(amount)method: balance를 감소
main.lua: Wallet module을 Require하고 두 개의 별도 wallet instance를 만든다. 각 instance에서 서로 다른 작업을 수행하여 독립적인 상태를 유지한다는 것을 보여 준다.
네 개의 inputs를 받는다:
- wallet A의 starting balance
- wallet B의 starting balance
- wallet A에 Add할 amount
- wallet B에서 Spend할 amount
main 파일에서:
- 첫 번째 starting balance로
walletA를 Create - 두 번째 starting balance로
walletB를 Create - 지정된 amount를
walletA에 Add - 지정된 amount를
walletB에서 Spend - 두 balance를 별도의 줄에 Print
최종 balance를 다음의 정확한 형식으로 Print한다:
Wallet A: [balance]
Wallet B: [balance]예를 들어 inputs가 100, 50, 25, 10이라면 Output은 다음과 같아야 한다:
Wallet A: 125
Wallet B: 40wallet A에 Add해도 wallet B는 변경되지 않고, wallet B에서 Spend해도 wallet A에는 영향을 주지 않는다는 점에 주목하자. 각 instance는 자신의 separate balance를 유지한다.
직접 해보기
-- 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]"
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러