Menu
Coddy logo textTech

싱글톤 테이블

Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 63번째.

때로는 프로그램 전체에서 어떤 것이 정확히 하나의 인스턴스만 필요할 때가 있습니다. 구성 관리자, 로깅 시스템 또는 게임 설정이 그 예입니다. 여러 복사본을 만들면 문제가 발생합니다. 어느 복사본에 올바른 데이터가 있을까요? Singleton 패턴은 인스턴스가 하나만 존재하도록 보장합니다.

Lua에서는 모듈이 작동하는 방식 덕분에 Singleton을 구현하는 것이 놀라울 정도로 간단합니다. 모듈을 require하면 Lua는 그 결과를 캐시합니다. 이후 require를 호출하면 새로운 테이블이 아니라 캐시된 테이블을 반환합니다.

-- GameConfig.lua
local GameConfig = {
    volume = 80,
    difficulty = "normal"
}

function GameConfig:setVolume(v)
    self.volume = v
end

return GameConfig

이제 프로그램의 어디에서든:

local config1 = require("GameConfig")
local config2 = require("GameConfig")

config1:setVolume(50)
print(config2.volume)  -- 50 (같은 테이블!)

config1config2는 모두 정확히 동일한 테이블을 참조합니다. 한 변수를 통해 변경한 내용은 다른 변수를 통해서도 확인할 수 있습니다. Lua의 require가 반환된 값을 package.loaded에 저장하고 이를 재사용하기 때문에 이 과정은 자동으로 이루어집니다.

새 객체를 생성하는 Factory 패턴과 달리, Singleton은 애플리케이션 전체에서 공유되는 상태를 보장합니다. 이는 코드의 여러 부분에서 일관되게 액세스하고 수정해야 하는 전역 설정에 이상적입니다.

challenge icon

챌린지

쉬움

Singleton 패턴을 사용하여 게임 설정 관리자를 만들어 봅시다! 프로그램의 모든 부분이 몇 번이나 require하더라도 정확히 동일한 설정에 액세스하도록 보장하는 configuration module을 만들게 됩니다.

코드를 두 개의 파일로 구성합니다:

  • GameSettings.lua: 게임 configuration을 저장하는 Singleton module을 Create합니다. settings table에는 musicVolume(70에서 시작), sfxVolume(100에서 시작), difficulty("normal"에서 시작)가 포함되어야 합니다. 이러한 설정을 수정할 세 가지 메서드 :setMusicVolume(value), :setSfxVolume(value), :setDifficulty(level)을 Add합니다. module 끝에서 table을 Return하는 것을 잊지 마세요!
  • main.lua: GameSettings module을 서로 다른 변수에 두 번 require하여 Singleton이 작동한다는 것을 Demonstrate합니다. FIRST 변수로 music volume과 difficulty를 change합니다. 그런 다음 SECOND 변수로 세 가지 설정을 모두 Print합니다. Singleton이 correctly 작동한다면 두 변수는 same table을 reference하므로, 한 변수를 통해 변경한 내용이 다른 변수를 통해서도 표시됩니다.

두 개의 inputs를 받습니다:

  1. 새 music volume(숫자)
  2. 새 difficulty level("easy" 또는 "hard"와 같은 string)

FIRST 변수를 통해 설정을 수정한 후, SECOND 변수를 사용하여 세 가지 설정을 각각 한 줄에 하나씩 다음 순서로 Print합니다: music volume, sfx volume, 그다음 difficulty.

예를 들어 inputs가 50hard라면 output은 다음과 같아야 합니다:

50
100
hard

inputs가 25easy라면 output은 다음과 같아야 합니다:

25
100
easy

sfx volume은 change하지 않았기 때문에 default 값인 100으로 유지되지만, music volume과 difficulty는 FIRST 변수를 통해 이루어진 변경 사항을 반영한다는 점에 주목하세요. 이는 두 변수가 same Singleton instance를 가리킨다는 것을 증명합니다!

REQUIRED OUTPUT FORMAT: [Your translated content here]

직접 해보기

-- main.lua - 싱글톤 패턴 시연

-- 입력 읽기
local newMusicVolume = tonumber(io.read())
local newDifficulty = io.read()

-- TODO: GameSettings 모듈을 변수에 불러오기 (예: settings1)

-- TODO: GameSettings 모듈을 다른 변수에 다시 불러오기 (예: settings2)
-- (싱글톤이 올바르게 작동하면, 두 변수 모두 같은 테이블을 참조합니다!)

-- TODO: 첫 번째 변수를 사용하여:
--   - 음악 볼륨을 newMusicVolume으로 설정
--   - 난이도를 newDifficulty로 설정

-- TODO: 두 번째 변수를 사용하여 설정을 출력
-- 각각 한 줄에 출력: musicVolume, sfxVolume, difficulty
quiz icon실력 점검

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

객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨

직접 연습해 보세요: 온라인 Lua 컴파일러