싱글톤 (Singleton)

1. 싱글톤 (Singleton)

Singleton 디자인 패턴은 클래스가 하나의 인스턴스만을 갖도록 하고, 그 인스턴스를 시스템 전역에서 엑세스할 수 있도록 하는 패턴이다. Python에서 싱글톤 클래스가 하나의 인스턴스를 갖도록 하기 위해서 __init__() 함수에서 객체 생성을 금지시키게 되는데, 일반적으로 __init__ 안에서 raise Exception()을 사용하게 된다. 싱글톤에서 생성되는 하나의 인스턴스는 실제 클래스 메서드를 사용하여 아래 예제의 get_instance()와 같이 캐시된 _instance 가 없는 경우 새로 생성하고, 이미 있는 경우 그 _instance 필드값을 리턴하는 방식을 사용한다.

class Singleton:
    _instance = None

    def __init__(self):
        raise Exception("Unable to create new instance")

    @classmethod
    def get_instance(cls):
        if cls._instance is None:
            cls._instance = cls.__new__(cls)
        return cls._instance

2. 싱글톤 사용하기

Singleton 인스턴스를 사용하기 위해서는, 클래스 객체를 개별적으로 생성하는 대신 Singleton 클래스의 싱글톤 생성 클래스 메서드(get_instance)를 사용한다. 예를 들어, 아래 예제에서 Singleton.get_instance()를 호출하여 싱글톤 인스턴스를 가져온 후, show_time() 과 같은 인스턴스 메서드를 호출한다.

import datetime

class Singleton:
    _instance = None
    
    def __init__(self):
        raise Exception("Unable to create new instance")
    
    @classmethod
    def get_instance(cls):
        if cls._instance is None:
            cls._instance = cls.__new__(cls)
        return cls._instance
    
    def show_time(self):
        now = datetime.datetime.now()
        print(now.strftime("%Y-%m-%d %H:%M:%S"))


inst = Singleton.get_instance()
inst.show_time()

3. 싱글톤 파생클래스 사용

Singleton 클래스를 생성한 후, 여기서 클래스를 파생하는 방식으로 싱글톤 패턴을 사용할 수 있다. 파생클래스에서 싱글톤 객체를 생성하기 위해서는, 부모클래스의 get_instance()를 호출하여 사용하고, 부모 혹은 파생클래스의 인스턴스 메서드를 호출하면 된다. 아래 예제는 Singleton 부모클래스에서 MyClass 파생클래스를 생성하고, 사용한 예를 표현한 것이다.

class MyClass(Singleton):
    def start(self):
        print("START")

my = MyClass.get_instance()
my.start()  

그리고, (부모클래스의 get_instance()를 사용하는 대신) 파생클래스에서 get_instance() 클래스 메서드를 재정의(override)하여 사용할 수도 있는데, 이는 파생클래스의 멤버를 초기화하는데 유용하다.

Python 프로그래밍 실습

본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.