Coding Memo

Singleton Design Pattern [싱글턴 패턴] 본문

etc

Singleton Design Pattern [싱글턴 패턴]

minttea25 2023. 6. 11. 12:42

싱글턴 패턴

 

싱글턴 패턴은 자주 이용되는 디자인 패턴 중 하나이다.

 

간단하게 정의하자면,

어떤 특정 컴포넌트의 인스턴스가 애플리케이션 전체에 단 하나만 존재해야 하는 상황에서 사용하는 디자인 패턴이다.

 

 

싱글턴으로 디자인된 클래스에 인스턴스를 요청하면, 인스턴스를 반환하는 방식이다.

직접 new()를 사용해 인스턴스를 생성하지 않는다는 것을 기억하자.


구현

 

위 내용을 코드로 구현한다면 (C#, Java)

class Singleton
{
    private static Singleton _instance;

    public static Singleton Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new(); return _instance;
            }
            return _instance;
        }
    }
}

 

Instance 필드로 Singleton 클래스에 인스턴스를 가져온다. Singleton 클래스는 인스턴스 요청 시에 인스턴스를 최초로 생성하고 반환한다.


Pros and Cons

 

Singleton 패턴이 매우 편리하고 유용하지만 단점도 분명히 존재한다.

 

Pros Cons
- Singleton Instance
- Global Access
- Lazy Initialization
- Thread Safety
- Global State
- Dependency Hiding
- Lifetime Management
- (Sometimes) Difficult to Subclass

 

장점

  • Singleton Instance
    싱글턴 패턴은 애플리케이션에 유일한 인스턴스를 보장한다. 그러므로 리소스나 어떤 특정 포인트를 공유할 때 유용하게 사용 될 수 있다.
  • Global Access
    싱글턴 패턴은 static으로 선언되어 전역 접근을 제공한다. (ex - Singleton.Instance.~~) 어떠한 부분에서도 호출하여 인스턴스를 가져와 사용할 수 있다.

  • Lazy Initialization
    싱글턴 클래스는 처음부터 만들어져 있는 것이 아니라 처음으로 인스턴스를 요청받을 때 만들어진다. 즉, 애플리케이션 시작 시에 바로 생성되어 메모리에 올려지는 것이 아니라 실행 도중에 수요(on-demand)에 의해 생성된다.

  • Thread Safety
    잘 구현되어 있다면, 멀티 쓰레드 환경에서 쓰레드 안정성을 보장하고 동시 접근에 대한 문제를 방지할 수 있다.

 

단점

  • Global State
    전역 변수 (global)를 사용한다는 것은 종속성 추적이 어려워지고 코드 간 종속성 발생으로 테스트 및 유지가 어려워 진다. (디버깅이 힘들어질 수 있다.)

  • Dependency Hiding
    직접 접근을 허용하므로 여기저기에서 접근 할 수 있어 종속성을 숨길 수 있다. 따라서 종속성 식별 및 관리가 어려워져 코드 간 밀접도가 높아지고 리팩터링이 어렵다.

  • Lifetime Management
    수명이 길어질 수 있고 잠재적으로 애플리케이션 전체 기간동안에도 존재할 수 있다. 수명 주기 관리가 힘들어 질 수 있어, 특정 상황에서 인스턴스를 소멸해야하는 시나리오 등에서 추가 적인 관리가 필요할 수 있다.

  • Difficult to Subclass
    경우에 따라, 싱글턴을 확장하거나 서브 클래스로 재사용하는 것이 어려울 수 있다. 싱글톤은 단 하나의 접근 포인트(Instance)를 제공하고 있기 때문에, 서브 클래스를 지정하고 해당 동작을 수정하는 기능을 제한 할 수 있다.

Summary

 

공유 리소스 활용, 매니저 등의 적재적소에 맞게 싱글턴 패턴을 활용하자. 무분별하게 사용하면 애플리케이션이 복잡해질 수록 디버깅이 힘들어 질 수 있다.

 

'etc' 카테고리의 다른 글

Command Pattern [커맨드 패턴]  (0) 2023.06.18
Observer Pattern [관찰자 패턴]  (0) 2023.06.11
OSI, TCP/IP  (0) 2023.06.04
우분투에서 파일 다운로드: wget  (0) 2022.08.16
AWS RDS (MariaDB) 설치 및 연동 - 4  (0) 2022.08.08