Singleton

Class가 있고 이 Class의 Instance가 생성될 때 Instance가 단 하나만 생성되게 하는 방법입니다.

 - 일반적으로는 Class의 Instance는 여러 개가 생성될 수 있습니다.


이해하기 어려우실 것 같은데

흔히 Class와 Instance를 예로 들 때 붕어빵 틀과 붕어빵을 비유합니다.


Class = 붕어빵 틀

Instance = 붕어빵

이라고 가정할 때 붕어빵 틀(Class)에서는 많은 붕어빵들(Instance)을 찍어낼 수 있죠

이럴 때 Singleton은 오로지 하나의 붕어빵(Instance)만 찍어내는 방법을 말합니다.

 - 때로는 클래스 내부 값이 여러 컨텍스트에서 값을 잃지 말고 지속적으로 유지해야할 때가 있기 때문에 Singleton은 필요한 기법입니다.

 - 데이터베이스를 사용하는 등의 동작을 예로 들 수 있습니다.



요래도 이해가 안되시는 분들이 있을 것이라 보고

예를 들어서 보도록 하겠습니다.

 - Code는 Python 2.7 기준입니다.



1 ~ 10 Singleton Class

 - Singleton Class를 만드는 방법에는 여러가지 방법이 있는데 그 중 Metaclass를 이용하는 방법입니다.

 - Metaclass는 Instance를 Class로 가지는 Class를 말하는데 자세한 내용은 다음에 포스팅 할 수 있도록 하겠습니다.

 - Singleton Class가 호출되었을 때 Instance가 한 곳을 바라보게 만듭니다.

 8. 현재 생성된 Instance가 _instance 리스트에 속하는지 확인합니다. 이전에 생성된 적이 없었다면 속하지 않을 것입니다.

 9. 현재 생성된 Instance의 Class (super : 상위 클래스) 생성자를 호출해 _instance 리스트에 추가합니다.

 10. 이를 리턴

 - 즉, Instance들이 생성되면 _instance 내의 cls(Instance)를 바라보게 만들어 하나의 인스턴스만 생성되게 하는 방식입니다.

 - 이해가 되실랑가 모르겠네요;; 설명이 이상해서ㅠㅠ



12 ~ 17. Database Class

 - Database Class를 만들고 Singleton Instance를 Metaclass로 가져가면서 Singleton Class가 되었습니다.

 - 초기화와 함께 value 변수를 갖게되고 이 변수를 0으로 초기화합니다.


20, 21. 두 개의 Database 인스턴스를 생성합니다.

23~26. 이 둘을 비교하고 같으면 "Same", 다르면 "Different"를 출력합니다.

28. instance1의 value를 1로 세팅하고

29. instance1과 instance2의 value를 출력해 두 instance가 하나인지 확인해봅니다.


결과는



Instance는 2개 선언되었지만 같은 값을 참조하는 것을 알 수 있습니다.

Posted by 긍정왕오킹