Singleton 패턴은 객체 지향 프로그래밍에서 클래스의 인스턴스가 오직 하나만 생성되도록 보장하는 디자인 패턴입니다. 이를 통해 특정 클래스의 인스턴스가 어디서든 동일한 것을 보장합니다. Singleton 패턴은 전역 변수처럼 동작하지만, 좀 더 안전하고 객체지향적인 방법으로 전역 상태를 관리할 수 있습니다.
Python에서 Singleton 패턴 구현 방법
- 클래스 변수 활용: 클래스 변수를 사용하여 클래스의 인스턴스가 이미 생성되었는지 확인하고, 새로 생성되지 않도록 제어합니다.
- 메타클래스 활용: 파이썬의 메타클래스를 이용하여 객체 생성을 제어할 수 있습니다. 이를 통해 싱글톤 패턴을 구현할 수 있습니다.
1. 클래스 변수를 사용한 Singleton 구현
class Singleton:
_instance = None # 클래스 변수로 인스턴스 추적
def __new__(cls):
# 인스턴스가 이미 존재하는지 확인
if cls._instance is None:
# 인스턴스가 없다면 새로운 인스턴스를 생성
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
def __init__(self):
self.data = "Singleton data"
# Singleton 클래스 사용
s1 = Singleton()
s2 = Singleton()
# 두 객체가 동일한 인스턴스를 가리키는지 확인
print(s1 == s2) # True
print(s1.data) # Singleton data
print(s2.data) # Singleton data
# 동일한 객체를 참조함을 증명
s1.data = "Modified data"
print(s2.data) # Modified data
설명:
__new__
메서드를 오버라이드하여 인스턴스가 이미 존재하는지 확인합니다.- 첫 번째 인스턴스가 생성된 후에는 동일한 인스턴스를 반환하도록 보장합니다.
s1
과s2
는 모두 동일한 인스턴스를 가리킵니다.
2. 메타클래스를 사용한 Singleton 구현
메타클래스를 사용하면 객체 생성 과정 자체를 제어할 수 있으므로, 더 강력하고 명확하게 Singleton 패턴을 구현할 수 있습니다.
class SingletonMeta(type):
_instances = {}
def __call__(cls, *args, **kwargs):
# cls가 이미 인스턴스화되었는지 확인
if cls not in cls._instances:
# 인스턴스가 없다면 생성 후 저장
instance = super(SingletonMeta, cls).__call__(*args, **kwargs)
cls._instances[cls] = instance
return cls._instances[cls]
# 메타클래스를 사용하는 클래스
class Singleton(metaclass=SingletonMeta):
def __init__(self):
self.data = "Singleton with metaclass"
# Singleton 클래스 사용
s1 = Singleton()
s2 = Singleton()
# 두 객체가 동일한지 확인
print(s1 == s2) # True
print(s1.data) # Singleton with metaclass
print(s2.data) # Singleton with metaclass
# 동일한 객체를 참조함을 증명
s1.data = "Modified metaclass data"
print(s2.data) # Modified metaclass data
설명:
SingletonMeta
는type
을 상속받은 메타클래스로, 클래스가 호출될 때마다 인스턴스가 이미 존재하는지 확인하고, 새 인스턴스가 생성되지 않도록 제어합니다.- 이 방법은 다양한 클래스에서 Singleton 패턴을 적용할 수 있으며, 메타클래스를 사용한 방법은 더 명시적이고 구조화된 방식입니다.
Singleton의 사용 사례:
- 로그 관리: 애플리케이션에서 하나의 로그 파일에 접근하여 여러 곳에서 기록하는 경우, 싱글톤 패턴으로 로그 관리 객체를 하나만 생성하도록 할 수 있습니다.
- 데이터베이스 연결: 데이터베이스와의 연결 객체가 애플리케이션 내에서 하나만 존재하도록 보장하기 위해 사용됩니다.
- 설정 관리: 설정 파일을 관리하는 객체가 시스템 전체에서 하나만 존재하도록 할 때 유용합니다.
요약:
- Singleton 패턴은 클래스의 인스턴스를 하나로 제한하는 디자인 패턴입니다.
- 파이썬에서
__new__
나 메타클래스를 사용하여 Singleton 패턴을 구현할 수 있습니다. - Singleton 패턴은 객체가 애플리케이션 내에서 오직 하나만 존재해야 할 때 사용됩니다.
Singleton 패턴은 필요한 경우에만 신중하게 사용해야 하며, 특히 전역 상태를 지나치게 사용하지 않도록 주의해야 합니다.
'실용적인 코드 샘플' 카테고리의 다른 글
[실용적인 코드 샘플] 메타클래스 기반 게임 설정값 저장 클래스 (0) | 2024.10.20 |
---|---|
[실용적인 코드 샘플] 리스트 상속 기반 스택(Stack) 자료구조 (2) | 2024.10.20 |
[실용적인 코드 샘플] 고정 크기 리스트 자료구조 (FixedSizeList) (0) | 2024.10.18 |
[실용적인 코드 샘플] 제너릭을 이용한 `Triple` 자료구조 1 (2) | 2024.10.16 |
[실용적인 코드 샘플] 특정 키와 값의 타입을 제한하는 딕셔너리 (TypedDict) (2) | 2024.10.16 |