Coding Memo
Singleton Design Pattern [싱글턴 패턴] 본문
싱글턴 패턴
싱글턴 패턴은 자주 이용되는 디자인 패턴 중 하나이다.
간단하게 정의하자면,
어떤 특정 컴포넌트의 인스턴스가 애플리케이션 전체에 단 하나만 존재해야 하는 상황에서 사용하는 디자인 패턴이다.
싱글턴으로 디자인된 클래스에 인스턴스를 요청하면, 인스턴스를 반환하는 방식이다.
직접 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 |