Skip to content

싱글턴 패턴 (Singleton pattern)

VG edited this page Jan 25, 2021 · 12 revisions

싱글턴 패턴 (Singleton pattern)

특정 클래스에 대해서 객체 인스턴스가 하나만 만들어질 수 있도록 해주는 패턴.출처: Head First Design Pattern

해당 패턴을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.출처: 위키백과

다이어그램

출처: 위키백과

예제

싱글턴 적용 방법은 2가지가 있다.

방법1C#

public sealed class Singleton
{
    public static Singleton Instance { get; } = new Singleton();    // 어플리케이션 시작과 동시에 초기화

    private Singleton() { }
}

sealed란?[1]

방법2 - 게으른 인스턴스 생성[2] (Lazy initialization)C#

public sealed class Singleton
{

    private static volatile Singleton instance = null;

    private Singleton() { }

    public static Singleton getInstance()    // (방법1)과 다르게 get메소드를 이용해 원할 때 객체를 생성하도록 함 (게으른 인스턴스 생성)
    {
        if (instance == null)
        {
            lock (typeof(Singleton))    // lock을 사용해 만일 멀티스레딩 호출로 인해, 객체가 두개이상 생기는 것을 방지
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
            }
        }

        return instance;
    }
}

Unity엔진 예제

class Singleton : MonoBehaviour
{
    public static Singleton Instance { get; private set; }

    private void Awake()
    {
        if (Instance != null && Instance != this) {
            Destroy(this.gameObject);
        } else {
            Instance = this;
        }
    }
}

🛑SRP위반?

Single Responsiblity Principle (단일 책임 원칙)

하나의 클래스하나의 책임만 가져야 한다.

싱글턴은 자신의 인스턴스를 관리하는(그리고 전역 접근을 제공하는)것 외에도 원래 그 인스턴스를 사용하고자하는 목적에 부합하는 작업을 책임져야 한다.
∴두가지를 책임지고 있다고 말할 수도 있다. 출처: Head First Design Pattern
하지만 싱글턴은 SRP를 위반함으로써 얻을 수 있는 이점이 더 크다


각주

[1]클래스에 적용된 경우 sealed 한정자는 다른 클래스가 해당 클래스에서 상속하지 못하도록 합니다.출처: 마이크로소프트 [↺]

sealed를 사용하면 얻을 수 있는 이점

  1. C# sealed 클래스의 함수는 오버라이드 되지 않음.
  2. 가상 함수 테이블 검사 과정을 생략.
  3. 가상 함수 테이블은 조회 시간이 상대적으로 짦음.
  4. callvirt 보다 속도에서 유리함.
    출처: 코딩 기록

[2] 게으른 인스턴스 생성 이란? [↺]
방법1과 다르게 getter메소드를 이용해 원할 때 객체를 생성하도록 함

Clone this wiki locally