JavaScript

웹 개발의 필수 언어

동적인 웹 페이지 구현을 위한 핵심 프로그래밍 언어.

Java

객체지향 프로그래밍

안정적이고 확장성 있는 백엔드 개발의 대표 언어.

HTML

웹의 기초

웹 페이지의 구조를 정의하는 마크업 언어.

React

현대적 UI 라이브러리

효율적인 사용자 인터페이스 구축을 위한 JavaScript 라이브러리.

CSS

웹 디자인의 핵심

웹 페이지의 시각적 표현을 담당하는 스타일 언어.

Spring

자바 웹 프레임워크

기업급 애플리케이션 개발을 위한 강력한 프레임워크.

Java/자바 학습

자바 싱글톤 패턴 (Singleton Pattern)

lamarcK 2025. 5. 18. 22:27

개요

싱글톤 패턴은 객체 지향 프로그래밍에서 인스턴스 생성을 제어하는 디자인 패턴이다.

여기서 핵심은 생성자를 private으로 선언하여 외부에서 new 키워드로 인스턴스를 생성하지 못하게 막고, 대신 static 메서드를 통해 단 하나의 인스턴스만 반환하도록 하는 것이다. 이렇게 하면 프로그램 전체에서 해당 클래스의 인스턴스는 오직 하나만 존재하게 되며, 이 인스턴스는 모든 곳에서 공유하여 사용할 수 있다.

예를 들어, 데이터베이스 연결이나 설정 정보와 같이 프로그램 전체에서 하나의 상태만 유지해야 하는 경우에 싱글톤 패턴을 사용한다.

목적

싱글톤의 주요 목적은 크게 두 가지다.

전역 상태 관리

  • 데이터베이스 연결
  • 설정 정보
  • 캐시
  • 로깅 시스템
public class DatabaseConnection {
    private static DatabaseConnection instance;
    private Connection connection;
    
    private DatabaseConnection() {
        // DB 연결 설정
    }
    
    public static DatabaseConnection getInstance() {
        if(instance == null) {
            instance = new DatabaseConnection();
        }
        return instance;
    }
}

 

유틸리티 함수 모음 (자바의 한계로 인한 용도)

  • 공통 기능
  • 헬퍼 함수
  • 유틸리티 메서드
public class StringUtils {
    private static StringUtils instance;
    
    private StringUtils() {}
    
    public static StringUtils getInstance() {
        if(instance == null) {
            instance = new StringUtils();
        }
        return instance;
    }
    
    public String format(String text) {
        // 문자열 포맷팅
    }
}

 

  • 원래 목적: 전역 상태 관리
  • 부가 목적: 자바에서 전역 함수 구현의 대안

구현 요소

필수 구성 요소

  • private 생성자
  • private static 인스턴스
  • public static 접근 메서드

구현 조건

  1. 클래스의 생성자는 private으로 선언되어야 함
  2. 인스턴스는 static으로 관리되어야 함
  3. 인스턴스 접근은 public 메서드를 통해서만 가능해야 함

함수형 프로그래밍이라면 별도의 함수를 사용해서 분리하면 되지만 자바는 모든 함수(메서드)가 클래스 안에서 선언되기 때문에 그것이 불가능하다. 때문에 

구현 방식

기본 싱글톤

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

Thread-Safe 싱글톤

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

Eager Initialization

public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}

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;
    }
}

Bill Pugh Singleton (권장)

public class Singleton {
    private Singleton() {}

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

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

장점과 단점

장점

  • 인스턴스가 하나만 생성됨을 보장
  • 전역 접근점 제공
  • 메모리 낭비 방지
  • 객체 공유 가능

단점

  • 단위 테스트의 어려움
  • 객체 지향 원칙에 위배될 수 있음
  • 과도한 사용 시 결합도 증가
  • 멀티스레드 환경에서 동기화 처리 필요

사용 사례

  • 설정 관리자
  • 데이터베이스 연결 관리
  • 로깅 시스템
  • 캐시 관리
  • 스레드 풀
  • 디바이스 관리자

구현 시 주의사항

  1. 직렬화/역직렬화 시 싱글톤 보장
  2. 리플렉션을 통한 싱글톤 파괴 방지
  3. 클론 메서드 오버라이드 고려
  4. 멀티스레드 환경 고려

권장 사항

  1. Bill Pugh 방식 사용 권장
  2. final 클래스로 선언하여 상속 방지
  3. 필요한 경우에만 사용
  4. 테스트 용이성 고려

참고 사항

  • Java 버전별 구현 방식 차이 고려
  • 프레임워크별 싱글톤 관리 방식 확인
  • 의존성 주입 프레임워크와의 통합 고려