본문 바로가기
2023년 이전/디자인 패턴

디자인 패턴 - 싱글턴 패턴(Singleton Pattern)

by JeongUPark 2019. 11. 14.
반응형

싱글턴 패턴이란 해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴. 하나의 인스턴스만을 생성하며,  getInstance 메서드를 통해 모든 클라이언트에게 동일한 인스턴스를 반환하는 작업을 수행한다.

 

작성 방법은 다음과 같습니다.

Java

public class SingleTon {

    private static SingleTon mSingleton;

    public static SingleTon getInstance(){
        if(mSingleton == null){
            mSingleton = new SingleTon();
        }
        return mSingleton;
    }
}

Kotlin

class SingleTon{
    companion object {
        var mSingleTon: SingleTon? = null
        fun getInstance(): SingleTon = mSingleTon ?: SingleTon()
    }
}

사실 kotlin의 경우 위처럼 안하구 간단하게

//선언
object Singleton {}
//사용
val singleton = Singleton

사용 할 수 있습니다. 근데 위처럼 하는 이유는 생산자를 통하여 singleton class  내부에 먼가 데이터를 더 추가할 때 사용 됩니다.

 

아무튼 이런 singleton은 하나의 인스턴스를 사용하기 때문에 프로젝트 전체에서 한개의 인스턴스를 통하여 그 인스턴스 내부의 동일한 데이터에 접근할 수 있다는 점이 있습니다.

 

하지만 이런 singleton에도 문제 점이 있습니다. 문제점은 동기화 문제 입니다.

 

인스턴스가 만들어 지기 전에 다중 스레드를 통하여 singleton을 사용해버리면  경합 조건(Race Condition) 을 발생하여 2개의 인스턴스가 생성될 수 있습니다. singleton은 하나의 인스턴스를 만들어서 어디서든 그 인스턴스에 접근하는 방식인데 2개의 인스턴스가 만들어지면 문제가 될 수 있습니다.

 

그래서 이 해결방법은 

1. syncronized 사용입니다.

public class SingleTon {

    private static SingleTon mSingleton;

    public static synchronized SingleTon getInstance(){
        if(mSingleton == null){
            mSingleton = new SingleTon();
        }
        return mSingleton;
    }
}

syncronized를 통하여 동기화를 맞춰 줍니다.

2. 인스턴스를 만들어서 초기화 하기

public class SingleTon {

    private static SingleTon mSingleton = new SingleTon();

    public static SingleTon getInstance(){
        return mSingleton;
    }
}

미리 초기화를 해두면 다중 스레드에서 접근해도 이미 만들어져 있기 때문에 getInstance를 통하여 동일한 인스턴스를 획득할 수 있습니다.

 

참고 

https://gmlwjd9405.github.io/2018/07/06/singleton-pattern.html

https://jusungpark.tistory.com/16?category=630296

반응형