Open kkirico opened 5 months ago
인스턴스를 하나 만들어서 사용하는 객체와 전역 변수의 차이?
전역 변수의 단점
class Singleton {
// 싱글톤 인스턴스를 저장할 정적 프로퍼티
private static instance: Singleton;
// 생성자를 private으로 선언하여 외부에서 인스턴스를 생성하는 것을 막음
private constructor() {}
public static getInstance() {
if (!Singleton.instance) {
Singleton.instance = new Singleton();
}
return Singleton.instance;
}
}
싱글턴을 왜 사용하나?
어떻게 유일한 객체를 보장하나?
class ChocolateBoiler {
private empty: boolean;
private boiled: boolean;
constructor() {
this.empty = true;
this.boiled = false;
}
public isEmpty() {
return this.empty;
}
public isBoiled() {
return this.boiled;
}
public fill() {
if (this.isEmpty()) {
this.empty = false;
this.boiled = false;
// 보일러에 우유/초콜릿 혼합재료를 집어넣음
}
}
public drain() {
if (!this.isEmpty() && this.isBoiled()) {
// 혼합재료를 다 끓여서 재료를 다음 단계로 넘김
this.empty = true;
}
}
public boil() {
if (!this.isEmpty() && !this.isBoiled()) {
// 혼합재료를 끓임
this.boiled = true;
}
}
}
인스턴스가 두 개 생긴다면? 두 개의 인스턴스가 하나의 기계를 제어하려고 할 때 문제가 발생할 수 있다.
초콜릿 보일러를 싱글턴으로 바꾸자.
싱글턴 패턴은 클래스 인스턴스를 하나만 만들고, 그 인스턴스로의 전역 접근을 제공한다.
요즘에는 spring이나 nest의 ioc container에서 인스턴스 관리를 해서 문제점을 해결한다.
고전적인 싱글톤 패턴
인스턴스가 절대 2개 이상이 되지 않도록 하는 구조
정의
클래스 인스턴스를 하나만 만들고 그 인스턴스로의 전역 접근을 제공한다.
getInstance();
의 null 체크가 별도의 스레드에서 일어나는경우 멀티스레딩 문제 발생 가능합니다해결책:
synchronize 키워드 사용하기
인스턴스를 처음부터 만들기
DCL(Double Checking Locking)을 사용하여 getInstance()에서 동기화하는 부분을 줄입니다.
이 방법은 두 번째 null 체크에서 동기화를 하므로, 초기에만 동기화하며 이후에는 동기화 없이 인스턴스를 반환하므로 성능이 향상됩니다.
// js 는 싱글스레드 아님? // ts도 마찬가지 아님?