티스토리 뷰

CS/디자인패턴

싱글톤(Singleton) 패턴

Nyugati 2023. 7. 23. 16:35

개발하다보면 '싱글톤'이라는 디자인 패턴을 자주 접하게 되는데, 그때마다 대충 구글링해서 이런거구나~ 하고 넘기다보니 기억에서 자주 삭제되는 바람에..;; 마음먹은 김에 정리해두려고 한다.


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이 될 것이다.

 

 

각 언어마다 싱글톤을 구현하는 방법은 다양하다.
중요한 것은, 한 프로세스 안에서 오브젝트를 만들 때 단 하나의 오브젝트만 만들도록 강제한다는 싱글톤의 개념이다!

 


본 포스팅은 아래의 유튜브 영상을 기반으로 제작되었습니다. 문제시 댓글 부탁드립니다.

https://youtu.be/-oy5jOd5PBg

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함