Spring/스프링입문을 위한 자바객체지향의 원리와 이해

싱글톤 패턴(Singleton Pattern)

1space 2025. 7. 3. 10:08

스프링입문을 위한 자바 객체지향의 원리와 이해』로 공부한 내용을 정리한 글입니다.

 

싱글톤 패턴이란?

"오직 하나의 인스턴스만 사용하게 하는 패턴"입니다.

왜 이런 패턴이 필요할까요?

  • 프로그램 실행 중에 동일한 객체가 계속 여러 개 생성되면 안 되는 경우가 있습니다.
  • 예를 들어, 설정을 관리하는 객체, 로그를 기록하는 객체, 데이터베이스 연결 객체 등은 하나만 존재해야 일관성 유지자원 절약이 가능합니다.

 

주요 특징

  1. 생성자를 private으로 만든다
    → 외부에서 new Singleton()으로 인스턴스를 만들지 못하게 막습니다.
  2. 클래스 내부에 static 참조변수를 둔다
    → 인스턴스를 클래스 내부에서 딱 하나만 만들어두고 공유합니다.
  3. getInstance()라는 정적 메서드로 인스턴스를 제공한다
    → 외부에서 이 메서드를 통해 단 하나의 객체만 얻을 수 있습니다.

 

코드

public class Singleton {
    static Singleton singletonObject; // 클래스가 공유하는 정적 참조 변수

    private Singleton() { } // 생성자를 private으로 막음

    public static Singleton getInstance() {
        if (singletonObject == null) {
            singletonObject = new Singleton(); // 한 번만 생성
        }
        return singletonObject; // 이후에는 계속 이 객체만 반환
    }
}

실행 흐름 예시

Singleton a = Singleton.getInstance();
Singleton b = Singleton.getInstance();

System.out.println(a == b); // true (같은 객체)

이렇게 하면 a와 b는 같은 인스턴스를 참조하게 되어, 어떤 상황에서도 객체가 하나만 존재합니다.

 

"유일한 인스턴스를, 꼭 정해놓은 하나만 사용하게 하는 패턴"

 

 

클래스 다이어그램 요약

  • Client가 직접 new Singleton()으로 만들지 못하고,
  • getInstance()를 통해 내부적으로 만들어진 단 하나의 객체만 사용합니다.
  • 객체는 클래스의 static 필드에 저장되어 재사용됩니다.

 

싱글톤 패턴의 장점

일관성 유지 동일한 객체를 사용하므로 상태가 일치
메모리 절약 하나만 만들기 때문에 불필요한 생성 X
전역 접근 어디서든 같은 객체를 공유
 

주의할 점

  • 멀티스레드 환경에서는 synchronized 처리를 하지 않으면 동시에 두 개 생성될 위험이 있습니다.
  • 이런 경우는 더 안전한 버전인 Double-checked locking, enum Singleton, Holder 패턴 등을 사용합니다.