[CS] 싱글톤 패턴(Singleton Pattern)

khj·2025년 1월 29일

Computer Science

목록 보기
17/25
post-thumbnail

1. 싱글톤 패턴이란?

싱글톤 패턴(Singleton Pattern)은 특정 클래스의 인스턴스를 하나만 생성하도록 제한하는 디자인 패턴입니다.
이 패턴을 사용하면 전역적으로 접근 가능한 단일 객체를 보장할 수 있습니다.

2. 싱글톤 패턴의 특징

  • 인스턴스가 하나만 존재
  • 전역 접근 가능
  • 메모리 절약 및 객체 생성 비용 감소
  • 멀티스레드 환경에서 동기화 문제 고려 필요

3. 싱글톤 패턴의 구현 방법

싱글톤 패턴을 구현하는 여러 가지 방식이 있으며, 각각의 방식에 따라 장단점이 존재합니다.

3.1. 기본적인 싱글톤 구현 (Lazy Initialization)

public class Singleton {
    private static Singleton instance;

    private Singleton() {} // 생성자 private

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  • 장점: 필요할 때만 인스턴스를 생성 (Lazy Initialization)
  • 단점: 멀티스레드 환경에서 동시 접근 시 여러 개의 인스턴스가 생성될 가능성 존재

3.2. 멀티스레드 안전한 싱글톤 (Synchronized)

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  • 장점: 동기화를 사용하여 멀티스레드 환경에서 안전
  • 단점: synchronized 사용으로 성능 저하 가능

3.3. DCL(Double-Checked Locking) 사용

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
  • 장점: synchronized 블록을 최소화하여 성능 최적화
  • 단점: 자바 1.5 이전에서는 volatile 키워드가 올바르게 동작하지 않을 수 있음

3.4. 정적 내부 클래스(Initialization-on-demand holder idiom)

public class Singleton {
    private Singleton() {}

    private static class Holder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
}
  • 장점: 클래스가 로드될 때 인스턴스가 생성되지 않고, getInstance()가 호출될 때 최초 생성됨
  • 장점: synchronized 없이 멀티스레드 환경에서도 안전

3.5. Enum을 활용한 싱글톤

public enum Singleton {
    INSTANCE;

    public void doSomething() {
        System.out.println("싱글톤 인스턴스 메서드 호출");
    }
}
  • 장점
    • 자바에서 제공하는 가장 안전한 싱글톤 패턴
    • 직렬화/역직렬화 문제 해결 (싱글톤을 유지)
    • 리플렉션을 통한 인스턴스 생성 방지

4. 싱글톤 패턴의 장점과 단점

장점 단점
전역적으로 동일한 인스턴스를 사용 가능 의존성이 증가하여 테스트하기 어려울 수 있음
객체 생성 비용 절감 멀티스레드 환경에서 구현 방식에 따라 동기화 비용 발생
메모리 절약 단일 인스턴스 사용으로 인해 가비지 컬렉션의 대상이 되지 않음

5. 싱글톤 패턴을 언제 사용해야 할까?

싱글톤 패턴은 애플리케이션에서 하나의 인스턴스만 유지해야 하는 경우에 적합합니다.

예시

  • 데이터베이스 연결 객체
  • 로그 관리 객체
  • 설정(configuration) 객체
  • 캐싱 시스템
profile
Spring, Django 개발 블로그

0개의 댓글