[디자인 패턴] 싱글턴(Singleton) 패턴

❓싱글턴 패턴?

싱글턴 패턴은 클래스의 인스턴스를 딱 하나로 고정시켜 놓도록 보장하는 패턴을 말합니다. 특정 클래스의 인스턴스가 오직 하나만 생성되기 때문에, 어디서든 그 인스턴스에 접근하더라도 하나의 인스턴스가 목적지가 됩니다.

싱글턴 패턴은 리소스 공유나 설정관리, 캐싱, 로그 새성과 같은 전역 상태를 가져야 하는 상황에서 사용되는 패턴입니다. 단일 인스턴스를 공유함으로써 리소스 낭비를 줄일 수 있고 일관된 상태를 유지할 수 있다는 것이죠!

❗싱글턴 패턴의 예시 (JS)

싱글턴 패턴의 예시를 자바스크립트 코드 보여드리겠습니다.

class Singleton {
  constructor() {
    if (!Singleton.instance) {
      Singleton.instance = this;
    }
    return Singleton.instance;
  }
}

const OBJ1 = new Singleton();
OBJ1.name = "lurgi";

const OBJ2 = new Singleton();

console.log(OBJ1.name); //lurgi
console.log(OBJ2.name); //lurgi

여기서 Singleton 패턴은 다음과 같습니다.

new 키워드를 통해 생성자 메서드가 실행되더라도, 계속해서 새로운 인스턴스를 반환하는 것이 아닌, Singleton 클래스 자체를 바인딩 하여 하나의 인스턴스에 고정시켰습니다.

그 결과로 OBJ1 인스턴스와 OBJ2 인스턴스는 하나의 객체를 참조하기 때문에, 변수를 공유하는 것을 볼 수 있습니다!

❓정적 클래스를 사용하면 되지 않을까?

충분히 정적 클래스를 사용하더라도 싱글톤 클래스와 같은 효과를 가진 객체를 만들 수 있습니다. 하지만 정적 클래스와 비교되는 차이점은 바로 메모리입니다.

정적 클래스는 객체를 메모리에 생성하지 않아 메모리 관리 차원에서 효율적인 방법입니다. 하지만 싱글턴 패턴은 메모리 자원에 할당되어 동적 객체를 만듭니다. 하지만 개발 언어에서는 정적 클래스와 일반 클래스를 엄밀히 구분하기 때문에 문제가 발생합니다.

일반 클래스와 정적 클래스를 구분하는 이유는 다형성 때문입니다. 정적 클래스는 다형성을 위한 인터페이스를 사용할 수 없다는 것이죠. 즉 상속에서 문제가 발생한다는 것입니다.

싱글턴은 4대 패턴에 들어가는 인기 패턴이라고 합니다. 폭넓게 사용하는 패턴인 만큼 충분히 익히는 것이 좋을 듯 합니다!😊