파이썬 언어는 OOP(Object Oriented Programming, 객체지향 프로그래밍)로써, 다양한 개발 기법들이 존재합니다.
그 중에서 이번에 소개해드릴 기법은 디자인패턴 중에 하나인 싱글톤(Singleton)입니다.
프로그래밍을 공부하시다 보면,
"아 이거는 객체처럼 쓸 수 있긴한데, 프로그램 시작할때만 생성하고 다른 어느 클래스에서 불러와도 동일한 (필드)값들을 유지하면 좋겠다."
라는 생각을 한번쯤 해보셨을 것입니다. 이를 위한 패턴이 바로 싱글톤(Singleton)입니다.
조금 더 자세히 설명을 드리자면,
싱글톤 패턴은 어떠한 클래스가 최초 한번만 메모리를 정적(Static)으로 할당하고 해당 메모리에 인스턴스를 만들어서 사용하는 기법입니다. 따라서 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나가 됩니다.
파이썬의 경우 객체를 생성하게 되면 가장먼저 __new__ 메소드가 호출됩니다. 이 키워드를 이용하여 간단하게 싱글톤패턴을 구현할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class SampleClass:
instance = None
def __new__(cls, *args, **kwargs):
if not cls.instance :
cls.instance = object.__new__(cls, *args, **kwargs)
print('인스턴스 생성 !')
return cls.instance
if __name__ == '__main__':
SampleClass()
SampleClass()
---
[ 결과 ]
인스턴스 생성 !
|
cs |
위와 같이 수행하였을 경우, "인스턴스 생성 !" 이라는 글이 한번만 출력된 것을 확인할 수 있습니다.
이를 이용하여 아래와 같이 간단히 클래스의 호출 횟수를 확인해보면 아래와 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
class SampleClass:
instance, count = None, 0
def __new__(cls, *args, **kwargs):
if not cls.instance :
cls.instance = object.__new__(cls, *args, **kwargs)
print('인스턴스 생성 !')
cls.count += 1
return cls.instance
def call(cls):
print(f'호출 횟수 : {cls.count}')
if __name__ == '__main__':
SampleClass().call()
SampleClass().call()
---
[ 결과 ]
인스턴스 생성 !
호출 횟수 : 1
호출 횟수 : 2
|
cs |
싱글톤 패턴을 활용한 클래스가 여러 개인 경우, 아래와 같이 상속을 이용해서도 구현할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
class SingletonCreater(object):
instance = None
def __new__(cls, *args, **kwargs):
if not cls.instance :
cls.instance = object.__new__(cls, *args, **kwargs)
print('인스턴스 생성 !')
return cls.instance
class SampleClassA(SingletonCreater):
count = 0
def call(cls):
cls.count += 1
print(f'클래스 A 호출 횟수 : {cls.count}')
class SampleClassB(SingletonCreater):
count = 0
def call(cls):
cls.count += 1
print(f'클래스 B 호출 횟수 : {cls.count}')
if __name__ == '__main__':
SampleClassA()
SampleClassA().call()
SampleClassB().call()
SampleClassB().call()
[ 결과 ]
인스턴스 생성 !
클래스 A 호출 횟수 : 1
인스턴스 생성 !
클래스 B 호출 횟수 : 1
클래스 B 호출 횟수 : 2
|
cs |
싱글톤 패턴은 굉장히 유용한 패턴 중에 하나입니다. 이를 이용하여 메모리를 한번만 할당받기에 낭비를 방지할 수 있으며, 다른 클래스에서 데이터를 처리하기 편합니다. ( 경험 상 쓰레드 관리를 위한 객체, 데이터베이스 관리를 위한 객체, 로그를 위한 객체 등에서 많이 사용합니다.)
하지만 싱글톤 패턴 사용에 대한 문제점은 존재합니다. 싱글톤 인스턴스에 대한 비중이 높아지면 클래스간 결합도가 높아져 OCP(Open-Close Principle)에 어긋나기 쉽습니다.
'Development > Etc' 카테고리의 다른 글
한국 지도 시각화하기 및 gps 표시 ( D3.js v5를 이용하여) (0) | 2019.02.13 |
---|---|
Python Flask[플라스크] 시작하기 - 1 (0) | 2019.01.20 |
Python Django[장고] 시작하기 - 2 (0) | 2019.01.18 |
Python Django[장고] 시작하기 - 1 (Pycharm, Anaconda를 이용하여) (0) | 2019.01.18 |
서버(Server), 클라이언트(Client) -기초, 브라우저 (2) | 2018.12.26 |