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")
이렇게 불러오면 멀티스레드 문제를 따로 다룰 필요 없이 동기화 처리가 가능하다.