티스토리 뷰

1. 싱글톤 패턴이란?

- 클래스의 인스턴스를 단 하나만 생성하여 전역적으로 공유하는 디자인 패턴

- 동일한 객체를 여러 곳에서 공유할 수 있어, 메모리 낭비를 줄이고 일관성을 유지할 수 있다

- 한 번 만들어진 객체의 메모리 주소를 공유

 

2. 싱글톤 패턴이 필요한 경우

1) 데이터베이스 연결

- DB 커넥션은 여러 개 만들 필요 없이 하나만 유지해야 함

2) 웹크롤러 인스턴스

- Selenium 같은 크롤러를 사용할 때, 여러 개 만들지 않고 하나의 브라우저 인스턴스를 공유

3) 설정(Configuration) 객체

- 애플리케이션의 환경 설정을 하나의 객체로 관리하여 모든 모듈에서 동일한 설정을 사용

4) 로그 시스템

- 모든 모듈이 동일한 로그 시스템을 공유

 

3. 일반 클래스와 싱글톤 패턴 비교

class Normal:
    def __init__(self):
        print("새로운 인스턴스가 생성됨!")

a = Normal()  # 새로운 인스턴스가 생성됨!
b = Normal()  # 새로운 인스턴스가 생성됨!

print(a is b)  # False (각기 다른 객체)

print(a) # <__main__.Normal object at 0x000001E55061DC40>
print(b) # <__main__.Normal object at 0x000001E55061DC40>

class Singleton:
    _instance = None  # 1) 클래스 변수로 인스턴스를 저장
    
    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super().__new__(cls)  # 2) __new__를 오버라이딩하여 기존 객체 반환
            print("새로운 인스턴스가 생성됨!")
        return cls._instance # 3) 기존 객체를 반환

# 테스트
c = Singleton() # 새로운 인스턴스가 생성됨!
d = Singleton() # 출력값 없음

print(c is d)  # True (두 변수가 같은 객체를 가리킴)
print(c) # <__main__.Singleton object at 0x000001E55061CB90>
print(d) # <__main__.Singleton object at 0x000001E55061CB90>

 

4. 객체 생성 과정 비교

1) __new__() : 객체를 생성(인스턴스가 생성되기 전에 실행되는 메서드)

2) __init__() : 생성된 객체를 초기화(설정)

3) cls: 클래스 자체를 가리킴

* 클래스 레벨에서 동작한다 : 객체(인스턴스)가 만들어지기 전, 클래스 자체에서 실행된다

4) self는 인스턴스가 존재해야 접근 가능

* 인스턴스 레벨에서 동작한다 : 인스턴스를 만들고 나서 실행되는 코드. 인스턴스가 있어야 호출할 수 있음

5) python에서 모든 클래스는 기본적으로 object를 상속받는다

- super().__new__(cls)를 호출하면 부모 클래스의 object. __new__가 실행됨

- super() : 현재 클래스의 부모를 의미

class Test1:
    def __new__(cls):
        print("새로운 객체를 만들지 않음!")

c = Test1() # 새로운 객체를 만들지 않음!
print(c) # None


class Test2:
    def __new__(cls):
        print("__new__ 실행됨!")
        instance = super().__new__(cls)  # 실제 객체 생성
        return instance  # 생성된 객체 반환
        

    def __init__(self):
        print("__init__ 실행됨!")  # 객체가 생성된 후 실행됨

a = Test2()
# __new__ 실행됨!
# __init__ 실행됨!
print(a) # <__main__.Test2 object at 0x000001E55061ED80>

b = Test2()
# __new__ 실행됨!
# __init__ 실행됨!
print(b) # <__main__.Test2 object at 0x000001E55060B0E0>

# 매번 객체를 생성하기 때문에 다른 주소를 가리킴

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함