인스턴스 변수
Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 12번째.
객체가 내부 데이터를 관리하는 방식에 초점을 맞춘 새로운 장에 오신 것을 환영합니다. 클래스를 만들고 인스턴스를 생성하는 방법을 배웠으니, 이제 each 인스턴스가 고유한 상태를 저장하고 관리하는 방식을 살펴볼 차례입니다.
인스턴스 변수는 하나의 객체에만 독점적으로 속하는 필드입니다. 메서드나 생성자 내부에서 self.something에 값을 할당하면 해당 데이터는 그 특정 인스턴스에만 저장됩니다. 같은 클래스의 다른 객체들은 각자 별도의 복사본을 가집니다.
테이블과 같은 복잡한 데이터를 저장할 때 특히 중요해집니다. 각 캐릭터가 서로 다른 아이템을 가지고 있는 인벤토리 시스템을 생각해 보세요.
local Inventory = {}
Inventory.__index = Inventory
function Inventory:new()
local instance = {}
setmetatable(instance, self)
instance.items = {} -- 각 인스턴스는 자신만의 빈 테이블을 가집니다
return instance
end
function Inventory:addItem(item)
table.insert(self.items, item)
end핵심 줄은 instance.items = {}입니다. 생성자 내부에 새로운 빈 테이블을 만들면 모든 inventory 객체가 각자 서로 다른 list를 받습니다. 반대로 items를 class 테이블 자체에 정의하면 모든 인스턴스가 실수로 같은 테이블을 공유하게 됩니다. 한 캐릭터에 검을 추가하면 모두가 그 검을 갖게 되는 셈입니다!
local bag1 = Inventory:new()
local bag2 = Inventory:new()
bag1:addItem("Sword")
bag2:addItem("Potion")
print(#bag1.items) -- 출력: 1
print(#bag2.items) -- 출력: 1Each inventory는 its own collection을 유지합니다. 이 패턴은 instance가 독립적으로 변경되는 데이터를 추적해야 할 때마다 적용됩니다. 예를 들면 목록, 카운터 또는 해당 객체에 고유한 모든 변경 가능한 상태가 있습니다.
챌린지
쉬움각 카트가 고유한 별도의 products 목록을 유지하는 ShoppingCart 시스템을 만들어 보겠습니다. 이를 통해 instance 변수가 객체 간에 데이터를 격리하는 방식을 확인할 수 있습니다. 한 카트에 items를 추가해도 다른 카트에는 영향을 주지 않습니다!
코드를 두 개의 파일로 구성합니다.
ShoppingCart.lua: 각 instance가 고유한products테이블을 갖도록ShoppingCartclass를 정의합니다. 다음을 포함하세요.- 각 카트에 대해 빈 products list를 초기화하는
:new()Constructor - 이 카트의 list에 product를 추가하는
:addProduct(productName)Method - 각 product를 별도의 line에 Print하는
:listProducts()Method
- 각 카트에 대해 빈 products list를 초기화하는
main.lua: ShoppingCart module을 Require하고 서로 분리된 두 개의 카트를 생성합니다. 각 카트에 서로 다른 products를 Add하여 독립적인 Inventory를 유지한다는 것을 확인합니다.
네 개의 inputs를 받습니다.
- cart A에 Add할 첫 번째 product
- cart A에 Add할 두 번째 product
- cart B에 Add할 첫 번째 product
- cart B에 Add할 두 번째 product
main 파일에서 다음을 수행합니다.
- 두 개의 shopping cart를 Create합니다:
cartA및cartB - 처음 두 products를
cartA에 Add합니다. - 마지막 두 products를
cartB에 Add합니다. Cart A:를 Print한 다음 cart A의 products를 list합니다.Cart B:를 Print한 다음 cart B의 products를 list합니다.
예를 들어 inputs가 Apple, Bread, Milk, Eggs인 경우 Output은 다음과 같아야 합니다.
Cart A:
Apple
Bread
Cart B:
Milk
Eggs핵심은 Constructor 내부에서 products를 새로운 빈 테이블로 Initialize하는 것입니다. 이렇게 하면 각 cart instance가 모든 카트에서 하나의 테이블을 공유하는 대신 고유한 별도의 list를 갖게 됩니다.
직접 해보기
-- ShoppingCart 모듈을 불러옵니다
local ShoppingCart = require('ShoppingCart')
-- 입력을 읽습니다
local product1 = io.read()
local product2 = io.read()
local product3 = io.read()
local product4 = io.read()
-- TODO: 두 개의 쇼핑 카트를 생성합니다: cartA와 cartB
-- TODO: product1과 product2를 cartA에 추가합니다
-- TODO: product3과 product4를 cartB에 추가합니다
-- TODO: "Cart A:"를 출력한 다음 cartA의 제품들을 나열합니다
-- TODO: "Cart B:"를 출력한 다음 cartB의 제품들을 나열합니다
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러