개요
싱글톤 패턴은 객체 지향 프로그래밍에서 인스턴스 생성을 제어하는 디자인 패턴이다.
여기서 핵심은 생성자를 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 접근 메서드
구현 조건
- 클래스의 생성자는 private으로 선언되어야 함
- 인스턴스는 static으로 관리되어야 함
- 인스턴스 접근은 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;
}
}
장점과 단점
장점
- 인스턴스가 하나만 생성됨을 보장
- 전역 접근점 제공
- 메모리 낭비 방지
- 객체 공유 가능
단점
- 단위 테스트의 어려움
- 객체 지향 원칙에 위배될 수 있음
- 과도한 사용 시 결합도 증가
- 멀티스레드 환경에서 동기화 처리 필요
사용 사례
- 설정 관리자
- 데이터베이스 연결 관리
- 로깅 시스템
- 캐시 관리
- 스레드 풀
- 디바이스 관리자
구현 시 주의사항
- 직렬화/역직렬화 시 싱글톤 보장
- 리플렉션을 통한 싱글톤 파괴 방지
- 클론 메서드 오버라이드 고려
- 멀티스레드 환경 고려
권장 사항
- Bill Pugh 방식 사용 권장
- final 클래스로 선언하여 상속 방지
- 필요한 경우에만 사용
- 테스트 용이성 고려
참고 사항
- Java 버전별 구현 방식 차이 고려
- 프레임워크별 싱글톤 관리 방식 확인
- 의존성 주입 프레임워크와의 통합 고려
'Java > 자바 학습' 카테고리의 다른 글
자바 산술 연산자와 오버 플로우/ 언더 플로우 (0) | 2025.05.19 |
---|---|
자바의 부호/증감 연산자 (0) | 2025.05.19 |
Java의 this 키워드 (1) | 2025.05.18 |
break와 continue 상세 설명 (0) | 2025.05.18 |
자바의 제어문(조건문, 반복문, 분기문) (0) | 2025.05.18 |