Skip to main content

๐Ÿญ ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด

์‹ฑ๊ธ€ํ†ค ๋””์ž์ธ ํŒจํ„ดโ€‹

๋ชจ๋“ˆ ๋ ˆ๋ฒจ ์‹ฑ๊ธ€ํ†ค (๊ฐ€์žฅ Pythonicํ•œ ๋ฐฉ๋ฒ•)โ€‹

  • ํŒŒ์ด์ฌ ๋ชจ๋“ˆ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์€ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ์ตœ์ดˆ import ์‹œ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ๋กœ๋“œ๋˜๊ณ  ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.

  • ๋”ฐ๋ผ์„œ ๋ชจ๋“ˆ ์ž์ฒด๋ฅผ ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ๋ชจ๋“ˆ ๋‚ด์— ํ•„์š”ํ•œ ๊ฐ์ฒด๋‚˜ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ  ์ด๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ์‹์ด ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ณ  ํŒŒ์ด์ฌ๋‹ค์šด ๋ฐฉ๋ฒ•์œผ๋กœ ์—ฌ๊ฒจ์ง‘๋‹ˆ๋‹ค.

# config.py (๋ชจ๋“ˆ ํŒŒ์ผ)
_db_connection = None # ์˜ˆ์‹œ: DB ์—ฐ๊ฒฐ ๊ฐ์ฒด (์‹ค์ œ๋กœ๋Š” ์—ฐ๊ฒฐ ๋กœ์ง ํ•„์š”)
_settings = {"theme": "dark", "version": "1.0"}

def get_db_connection():
global _db_connection
if _db_connection is None:
print("Creating DB connection...")
# ์‹ค์ œ DB ์—ฐ๊ฒฐ ๋กœ์ง
_db_connection = "Connected DB Object"
return _db_connection

def get_setting(key):
return _settings.get(key)

def update_setting(key, value):
_settings[key] = value

# main.py (์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ํŒŒ์ผ) ########## ์—ฌ๊ธฐ๋Š” ๋‹ค๋ฅธ ํŒŒ์ผ ##########
import config # config ๋ชจ๋“ˆ์„ ์ž„ํฌํŠธ

conn1 = config.get_db_connection()
conn2 = config.get_db_connection() # "Creating DB connection..."์€ ํ•œ ๋ฒˆ๋งŒ ์ถœ๋ ฅ๋จ

print(f"conn1 is conn2: {conn1 is conn2}") # ์ถœ๋ ฅ: conn1 is conn2: True

print(config.get_setting("theme")) # ์ถœ๋ ฅ: dark
config.update_setting("theme", "light")
print(config.get_setting("theme")) # ์ถœ๋ ฅ: light

์‚ฌ์‹ค ๋‹ค๋ฅธ ํŒจํ„ด์€ ์•Œํ•„์š” ์—†์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ•œ๋ฒˆ ์ž‘์„ฑํ•ด๋ด…๋‹ˆ๋‹ค.โ€‹

new ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•โ€‹

  • ํด๋ž˜์Šค์˜ new ๋ฉ”์†Œ๋“œ๋Š” init ๋ณด๋‹ค ๋จผ์ € ํ˜ธ์ถœ๋˜์–ด ๊ฐ์ฒด ์ƒ์„ฑ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

  • ํด๋ž˜์Šค ๋ณ€์ˆ˜์— ์ธ์Šคํ„ด์Šค๋ฅผ ์ €์žฅํ•˜๊ณ , new ๋ฉ”์†Œ๋“œ์—์„œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ด๋ฏธ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ๊ธฐ์กด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

class SingletonClass:
_instance = None

def __new__(cls, *args, **kwargs):
if cls._instance is None:
print("Creating new instance")
# ์ƒˆ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ (super() ์‚ฌ์šฉ)
cls._instance = super().__new__(cls)
# ์—ฌ๊ธฐ์„œ ์ถ”๊ฐ€ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜๋ฉด ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, __init__์—์„œ ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ 
else:
print("Returning existing instance")
return cls._instance

def __init__(self, data):
# __init__์€ __new__๊ฐ€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ ํ•„์š”
# ์•„๋ž˜์ฒ˜๋Ÿผ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ๋˜๋„๋ก ๋ฐฉ์–ด ์ฝ”๋“œ๋ฅผ ๋„ฃ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ
if not hasattr(self, '_initialized'):
print(f"Initializing instance with data: {data}")
self.data = data
self._initialized = True
else:
print(f"Instance already initialized (data: {self.data})")


# ์‚ฌ์šฉ ์˜ˆ์‹œ
s1 = SingletonClass("Data 1")
print(f"s1 data: {s1.data}")

s2 = SingletonClass("Data 2") # __new__๋Š” ๊ธฐ์กด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ, __init__์€ ๋˜ ํ˜ธ์ถœ๋จ
print(f"s2 data: {s2.data}") # ์ถœ๋ ฅ: s2 data: Data 1 (s1๊ณผ ๊ฐ™์€ ๊ฐ์ฒด์ด๋ฏ€๋กœ data๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์Œ)

print(f"s1 is s2: {s1 is s2}") # ์ถœ๋ ฅ: s1 is s2: True