bkdragon's log

싱글톤 패턴 본문

Typescript

싱글톤 패턴

bkdragon 2024. 11. 13. 22:16

싱글톤 패턴은 하나의 클래스에 단 하나의 인스턴스만 존재하도록 보장하는 디자인 패턴이다. 이 패턴은 동일한 인스턴스를 공유함으로써 메모리 사용량을 줄이고, 특정 리소스를 여러 객체가 공유해야 할 때 유용하다.

싱글톤 패턴 구현 방법

타입스크립트로 싱글톤 패턴을 구현하는 방법은 아래와 같다:

1. 클래스의 생성자를 private으로 설정하기

private 생성자는 외부에서 클래스를 인스턴스화하는 것을 막아준다. 이를 통해 클래스 외부에서는 new 키워드로 새로운 인스턴스를 만들 수 없게 된다.

2. 클래스 내부에서 static 변수를 통해 인스턴스를 저장하기

static 변수는 클래스 자체에 종속되며, 인스턴스를 한번만 생성한 후 공유할 수 있도록 한다.

3. 클래스 메서드를 통해 인스턴스 접근 제공

getInstance() 메서드를 통해 클래스 외부에서 단일 인스턴스에 접근할 수 있도록 한다. 인스턴스가 이미 생성되었는지 확인하고, 없다면 새로 생성한다. 이렇게 하면 인스턴스가 항상 하나만 유지된다.


싱글톤 패턴 기본 형태

class Singleton {
  private static instance: Singleton;

  private constructor() {
  }

  public static getInstance(): Singleton {
    if (!Singleton.instance) {
      Singleton.instance = new Singleton(); // 인스턴스가 없으면 새로 생성
    }
    return Singleton.instance;
  }

  public someMethod(): void {
    console.log("싱글톤 인스턴스의 메서드 호출");
  }
}

// 사용 예시
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();

console.log(instance1 === instance2); // true, 동일한 인스턴스 반환
instance1.someMethod();

싱글톤 패턴 활용 예시

테마를 관리하는 예시를 살펴보자.

type ThemeType = "light" | "dark";

interface ThemeColors {
    background: string;
    text: string;
    primary: string;
}

class ThemeManager {
    private static instance: ThemeManager | null = null;
    private currentTheme: ThemeType = "light";

    private themeColors = {
        light: {
            background: "#FFFFFF",
            text: "#000000",
            primary: "#007AFF",
        },
        dark: {
            background: "#000000",
            text: "#FFFFFF",
            primary: "#0A84FF",
        },
    };

    private constructor() {}

    public static getInstance(): ThemeManager {
        if (!ThemeManager.instance) {
            ThemeManager.instance = new ThemeManager();
        }
        return ThemeManager.instance;
    }

    public getTheme(): ThemeType {
        return this.currentTheme;
    }

    public getColors(): ThemeColors {
        return this.themeColors[this.currentTheme];
    }

    public toggleTheme(): void {
        this.currentTheme = this.currentTheme === "light" ? "dark" : "light";
        console.log(`테마가 ${this.currentTheme}로 변경되었습니다.`);
    }
}

// 사용 예시
const themeManager1 = ThemeManager.getInstance();
const themeManager2 = ThemeManager.getInstance();

console.log("현재 테마:", themeManager1.getTheme()); // 'light'
console.log("현재 색상:", themeManager1.getColors()); // light 테마 색상

themeManager1.toggleTheme();
console.log("변경된 테마:", themeManager2.getTheme()); // 'dark' 
console.log("변경된 색상:", themeManager2.getColors()); // dark 테마 색상

싱글톤 패턴의 장단점

장점

  • 인스턴스가 하나만 존재하므로 메모리 낭비를 줄일 수 있다.
  • 동일한 인스턴스를 사용함으로써 데이터의 일관성을 유지할 수 있다.

단점

  • 테스트 시 인스턴스가 고정되므로, 테스트가 어려울 수 있다는 단점이 있다.
  • 멀티 스레드 환경에서 인스턴스 생성 시 동기화 처리가 필요할 수 있다.

'Typescript' 카테고리의 다른 글

빌더 패턴  (0) 2024.11.10
팩토리 메서드, 추상 팩토리 패턴  (0) 2024.11.09
Absolute  (1) 2023.10.29
ReplaceAll  (0) 2023.10.23
문자열의 길이 구하기  (1) 2023.10.21