상세 컨텐츠

본문 제목

생성 패턴 중 '싱글톤' 패턴에 대하여..

소프트웨어공학

by amanda.hyon 2024. 7. 14. 18:09

본문

 

싱글톤 패턴(Singleton Pattern)은 생성 패턴 중 하나로, 특정 클래스의 인스턴스가 하나만 생성되고, 어디서든지 그 인스턴스에 접근할 수 있도록 하는 패턴입니다. 주로 애플리케이션에서 전역적인 접근이 필요한 객체에 사용됩니다. 싱글톤 패턴은 인스턴스를 하나만 유지하여 자원 낭비를 방지하고, 여러 클래스가 동일한 자원에 접근할 때 일관성을 유지할 수 있습니다.

 

자바에서는..

Spring Boot에서 싱글톤 패턴은 주로 @Service나 @Component 애노테이션을 통해 구현됩니다. 하지만 기본적인 싱글톤 패턴의 예제를 직접 구현해보겠습니다.

 

자바에서는 싱글톤 패턴을 구현할 때 정적 변수와 정적 메서드를 사용합니다. 멀티스레드 환경에서도 안전하게 싱글톤 인스턴스를 생성하기 위해 synchronized 키워드를 사용합니다.

 

public class Singleton {
    // 유일한 인스턴스를 저장할 정적 변수
    private static Singleton instance;

    // 생성자를 private으로 정의하여 외부에서 직접 인스턴스화하지 못하도록 함
    private Singleton() {}

    // 인스턴스를 반환하는 정적 메서드
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

    // 예제 메서드
    public void showMessage() {
        System.out.println("Hello from Singleton!");
    }
}

// 사용 예시
public class Main {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        singleton.showMessage();
    }
}

 

 

파이썬에서는...

파이썬에서는 메타클래스를 사용하여 싱글톤 패턴을 구현할 수 있습니다. 메타클래스는 클래스의 생성 방식을 제어할 수 있는 강력한 도구로, 여기서 _instances 딕셔너리를 사용하여 이미 생성된 인스턴스를 재사용합니다.

class SingletonMeta(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            instance = super().__call__(*args, **kwargs)
            cls._instances[cls] = instance
        return cls._instances[cls]

class Singleton(metaclass=SingletonMeta):
    def __init__(self):
        self.value = None

    def show_message(self):
        print("Hello from Singleton!")

# 사용 예시
singleton1 = Singleton()
singleton2 = Singleton()

singleton1.value = "First instance"
print(singleton2.value)  # First instance

singleton1.show_message()  # Hello from Singleton!
singleton2.show_message()  # Hello from Singleton!
  • singleton1과 singleton2가 동일한 인스턴스인지 확인한 결과는 True입니다. 이는 두 객체가 동일한 인스턴스를 가리키고 있음을 의미합니다.
  • singleton1에서 설정한 값 singleton1.value = "First instance"가 singleton2.value에서도 동일하게 나타납니다. 즉, "First instance"라는 값을 반환합니다.
  • singleton1.show_message()와 singleton2.show_message() 모두 "Hello from Singleton!"이라는 메시지를 반환합니다.

관련글 더보기

댓글 영역