티스토리 뷰
개발하다보면 '싱글톤'이라는 디자인 패턴을 자주 접하게 되는데, 그때마다 대충 구글링해서 이런거구나~ 하고 넘기다보니 기억에서 자주 삭제되는 바람에..;; 마음먹은 김에 정리해두려고 한다.
Singleton 패턴이란
🌟 프로세스가 실행 중에 오직 하나의 오브젝트만 생성되도록 강제하는 디자인 패턴
즉, 싱글톤 디자인 패턴을 가진 클래스를 사용해서 여러 개의 오브젝트를 만들더라도, 모두 단 하나의 오브젝트만 가리키도록 만드는 것이다.
언제 사용하나?
- 하나의 오브젝트가 리소스를 많이 차지할 때
- 하나의 오브젝트가 외부 네트워크와 연결되는데, 이 네트워크는 하나만 존재해야 할 때 등등
예시
1. 싱글톤 적용 X
class Cat {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name, "~mewo");
}
}
let kitty = new Cat("kitty");
let nabi = new Cat("nabi");
kitty.speak();
nabi.speak();
if (kitty === nabi) {
console.log("same");
} else {
console.log("different");
}
위 자바스크립트 코드를 살펴보면
Cat이라는 일반클래스를 정의한 후 kitty, nabi라는 이름의 instance를 생성한다.
이후 kitty와 nabi 객체가 같은지 판별하는 코드를 실행하면 kitty ~mewo
, nabi ~mewo
, different
라는 결과가 출력된다.
당연하다. kitty와 nabi는 각각 다른 메모리 공간의 오브젝트를 가리키고 있기 때문이다.
여기까지는 일반적인 클래스와 인스턴스 생성이 되겠다.
2. 싱글톤 적용 O
class SingleCat {
static instance;
constructor(name) {
this.name = name;
if (!SingleCat.instance) {
SingleCat.instance = this;
}
return SingleCat.instance;
}
speak() {
console.log(this.name, "~mewo");
}
}
let kitty = new SingleCat("kitty");
let nabi = new SingleCat("nabi");
kitty.speak();
nabi.speak();
if (kitty === nabi) {
console.log("same");
} else {
console.log("different");
}
싱글톤 클래스를 정의할 때 static 변수instance
를 하나 생성해야 한다. 이 static 키워드로 인해 변수는 공유의 개념을 갖게 되고, 한 곳의 메모리만 가리키게 된다. 따라서 static 변수의 값은 프로그램 전체에서 공유된다.
똑같이 kitty와 nabi 객체를 생성하면 해보자. 이 두 객체는 앞선 예제처럼 다른 메모리 공간의 오브젝트를 가리키고 있을까?
당연히 아니다! 둘 다 프로세스의 시작부터 끝까지 유지되는 instance(static 변수)를 가리키기 때문이다.
그러니 위 코드의 실행결과는 kitty ~mewo
, kitty ~mewo
, same
이 될 것이다.
각 언어마다 싱글톤을 구현하는 방법은 다양하다.
중요한 것은, 한 프로세스 안에서 오브젝트를 만들 때 단 하나의 오브젝트만 만들도록 강제한다는 싱글톤의 개념이다!
본 포스팅은 아래의 유튜브 영상을 기반으로 제작되었습니다. 문제시 댓글 부탁드립니다.