1. 싱글톤 패턴이란
- 싱글톤(Singleton)패턴은 객체의 인스턴스가 오직 1개만 생성되는 패턴을 말한다.
- 싱글톤 패턴이 적용된 객체는 하나의 인스턴스만 생성할 수 있고, 다른 객체에서 싱글톤 객체의 인스턴스를 생성하려 할 경우, 기존의 생성된 인스턴스가 있다면 이를 반환하는 형태로 사용
- 모든 데이터를 전역으로 관리하여 쉽게 접근하게 하는 것
- 객체의 메모리를 정적으로 할당하여 하나의 객체에만 접근하는 방법
2. 싱글톤 패턴을 사용하는 경우
- 공통된 객체를 여러개 생성해서 사용하는 경우
- 인스턴스가 절대적으로 하나만 존재하는 것을 명시하고 싶은 경우
3. 싱글톤 패턴의 장점
- 편리성 : 최초로 생성된 객체 하나에만 접근하게 되므로 데이터를 접근하고 수정하는것이 용의
- 중복방지 : 생성자를 다른 곳에서 새롭게 선언을 하더라도 이미 정적으로 선언된 객체가 반환되기 때문에 중복되어 생성되는 것을 방지
- 빠른 접근 : 초기 객체 생성시 정적 메모리에 올라간 이후 호출할 때 빠르게 접근할 수 있음.
- 메모리 절약 : 많은 클래스에서 동일한 객체의 인스턴스를 생성해야하는 경우, 싱글톤 패턴을 사용하여 매번 인스턴스를 생성하지 않고 불러서 쓰는 형태로 사용되어 메모리 절약
4. 싱글톤 패턴의 단점
- 성능 저하 : 정적 메모리에 할당할 수 있는 메모리 크기가 제한적이므로 정적 메모리에 할당된 객체로 너무 큰 메모리가 쌓이게 되면 프로그램 성능이 현저히 낮아짐
- 높은 결합도 : 프로그램이 복잡해지면서 싱글톤 인스턴스가 너무 많이 사용되거나 공유하게 되면 다른 클래스들 간의 결합도가 높아지게 되어 유지보수가 어려워진다.
- 메모리 접근 : 하나의 정적 메모리를 사용하기 때문에 병렬처리나 동기화 같은 여러 방법으로 메모리에 접근하는데 문제가 생길 수 있음
- 다중 인스턴스 생성: 위 문제처럼, 여러 스레드가 동시에 인스턴스를 생성하려고 할 때 예상치 못한 다중 인스턴스가 생성(싱글톤 패턴 특성에 위배된다.)될 수 있습니다.
- 데이터 일관성 문제: 싱글톤 인스턴스가 공유하는 데이터가 있다면, 여러 스레드가 동시에 이 데이터를 수정할 때 데이터 일관성 문제가 발생할 수 있다.
예시 코드
public sealed class Singleton
{
private static readonly Singleton _instance = new Singleton();
// 생성자를 private으로 만들어 외부에서 접근하지 못하도록 함
private Singleton()
{
// 생성자 로직
}
public static Singleton Instance
{
get
{
return _instance;
}
}
}
- Thread-safe 싱글톤
ㄴ 여러 스레드에서 동시 접근해도 안전한 방식
public sealed class Singleton
{
private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton());
public static Singleton Instance { get { return lazy.Value; } }
private Singleton()
{
// 생성자 로직
}
}