프로그래밍/Python

[디자인 패턴] 싱글톤

Dibrary 2022. 7. 5. 09:50
반응형

안녕하세요 Dibrary입니다.

디자인패턴이 몇 개 있는데, 그 중에 싱글톤을 정리해두고자 합니다.

 

싱글톤은 아래와 같이 설명할 수 있습니다.

여러 사람이 접근 하더라도 해당 객체는 반드시 같은 객체여야 한다.
이러한 경우에 싱글톤 패턴을 적용할 수 있다.

 

여러 사람이 접근하더라도 해당 객체는 반드시 같아야 한다는게 무슨 의미일까요?

즉, '하나의 객체(인스턴스)'만 생성이 되고 이걸 여러 사람이 '돌려쓴다'는 개념입니다.

 

대표적으로 DB접속할 때 쓸 수 있습니다.

 


Jupyter를 이용해서 코드를 확인해보겠습니다.

Singleton이라는 클래스에 __new__ 메서드와, __init__메서드가 있습니다.

__init__은 많이들 생성자로 알고 계실텐데요, 위 코드를 보면 __new__가 먼저 실행되었음을 볼 수 있습니다.

__init__메서드는 클래스 인스턴스를 생성하지 않습니다. 객체에 메모리를 할당하는 것이 __new__메서드 입니다.

즉, __new__메서드가 먼저 실행되어 객체에 메모리를 할당하고 __init__이 실행됩니다. 

 

참고로, __new__메서드는 object를 반환합니다.

 

그럼 여기서, 생성자의 정확한 역할이 뭘까요?

생성자는

인스턴스를 사용자가 원하는대로 사용하게 시작상태를 맞춰주는 것

이라고 볼 수 있습니다.

그렇기 때문에 우리가 __init__을 생성자라고 부르는 것입니다.

 

어이쿠, 얘기가 샜네요.

 

어찌되었든, 위 코드를 보시면, s1객체든, s2객체든, s3 객체든 모두 같은 주소를 출력하는것을 볼 수 있습니다. 즉, 모두 같은 객체인 셈이죠.

 

이게 어떻게 가능한가 하면, 순서대로

1. Singleton 인스턴스 생성시 __new__메서드에서 초기 인스턴스가 없으면(not hasattr) cls._instance에 객체를 저장합니다. 그리고 그 객체를 반환하죠.

2. Singleton 인스턴스 생성시 __new__메서드에서 초기 인스턴스가 있으면 조건문으로 빠지지 않고 곧바로 cls._instance를 반환하죠.

 

인스턴스의 생성이 오로지 '만들어진적이 있느냐, 없느냐'로만 나뉘므로, 처음에만 만들 수 있고 그 이후부터는 계속 만들어진 것이 반환되는 것입니다.

 

 

728x90
반응형