CS

[디자인패턴] 싱글톤 패턴 :: Singleton Pattern

D0HAN. 2020. 8. 9. 23:53

싱글톤 패턴 (Singleton Pattern)

 


정의

어플리케이션이 시작될 때

인스턴스를 단 하나만 생성하도록 하며,

생성된 인스턴스를 어디에서든지 참조할 수 있도록 한다.

즉, 인스턴스가 필요할 때 똑같은 인스턴스를 만드는 것이 아니라 기존 인스턴스를 사용

 


이유

 

고정된 메모리 영역을 얻어 메모리 낭비 방지

인스턴스가 절대적으로 한 개만 존재하는 것을 보증하고 싶을 경우 사용

 


단점

싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 

다른 클래스의 인스턴스들 간의 결합도가 높아져 객체 지향 설계 원칙에 어긋난다.

개방-폐쇄 원칙 위배

변경에 유연하게 대처할 수 없어 수정이 어려워진다.

멀티쓰레드 환경에서 동기화 처리를 안 하면 인스턴스가 두개 생성될 수도 있음


JAVA

하나의 인스턴스 유지하기 위해 인스턴스 생성에 제약을 걸어야 한다.

new를 실행할 수 없도록 생성자에 private 접근제어자를 지정,

유일한 단일 객체를 반환할 수 있도록 정적 메소드 지원.

메소드를 동기화 시켜야 멀티스레딩 문제가 생기지 않음.

 

고전적인 방법

public class Singleton{

	private static Singleton uniqueInstance;
	
	private Singleton(){}
	
	public static Singleton getInstance(){

		if(uniqueInstance == null){
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}	
	
}

하지만 이 코드는 멀티스레드 프로그램에서 인스턴스가 2개 이상 생성될 수 있음

이걸 막아주기 위해서는

게으른 초기화 방법으로 synchronized를 사용 ==> 성능저하가 너무 큼

holder를 이용 ==> 가장 보편적으로 사용하는 방법


SWIFT

자바에서는 여러가지 멀티스레드환경에서 처리해주어야 할 것이 많은데, 

swift에서는 비교적 간단하다.

class Printer {
    static let shared = Printer()
    private init() {}

    func printDoc(_ doc: String) {
        print(doc)
    }
}

이렇게 해주고 클라단에서

Printer.shared.printDoc("Print Document")

이렇게 불러오면 멀티스레드 문제를 따로 다룰 필요 없이 동기화 처리가 가능하다.