싱글톤 패턴
소프트웨어 디자인 패턴에서 싱글턴 패턴(Singleton pattern)을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. <위키백과 싱글턴패턴>
쉽게 말하면 싱글톤 클래스는 그 인스턴스가 단 하나만 생성되게 하는 것이다.
예시 코드를 보자면
public class Singleton
{
private Singleton() { }
private static Singleton instance = null;
public static Singleton Instance
{
get
{
if (instance == null)
instance = new Singleton();
return instance;
}
}
}
이런 식으로 Singleton 인스턴스는 단 하나만 만들어지고 만들어졌다면 이미 만들어진 객체를 통해 접근한다.
그럼 static과 똑같은거 아닌가?
->Singleton과 static이 비슷하게 느껴져서 차이점을 찾아서 아래에 정리했다.
Singleton
- 단 하나의 객체를 만들어서 생성하려고 할 때 없다면 하나를 생성하고 있다면 만들어져 있는 것을 리턴한다.
- 확장과 인터페이스 구현이 가능하다
- 언제 생성하는지에 대한 시점 확인이 가능하다.
- 싱글톤은 구현으로 단 하나만 생성되게 보장된 것이지만, 클래스 객체이기 때문에 직렬화<1>가 가능하다.
Static
- 인스턴스를 생성할 수 없다. 생성자도 만들 수 없다.
- 프로그램이 시작할 때 정적 스택에 바로 초기화된다.
- 쓰레드 관리가 어렵다.
전역에서 접근이 가능한 하나 뿐인 존재이니 주요 클래스나 관리자의 역할에 어울린다.
주의할 점
싱글톤 인스턴스가 너무 많은 책임을 짊어지는 경우를 주의해야한다. (OOP 단일책임원칙 위반)
싱글톤의 남발은 코드 결합도가 높아진다.
->싱글톤의 소스 코드가 바뀌면 그걸 갖다 쓰는 애들 다 영향을 받음
처음 봤을 땐 "싱글톤 개사기네 ㅋㅋ" 라는 생각이 들었지만 좋다고 남발하면 안되고
싱글톤을 굳이 안써도 되는 경우에서는 싱글톤을 안쓰는게 좋다 !
<1>직렬화 : 컴퓨터 과학의 데이터 스토리지 문맥에서 데이터 구조나 오브젝트 상태를 동일하거나 다른 컴퓨터 환경에 저장하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정 <위키백과 직렬화>
[출처]
https://yjksw.github.io/singleton-vs-static/
https://os94.tistory.com/158