관리 메뉴

나만의공간

🧱 1. 싱글턴 패턴이란? 본문

IT/JAVA

🧱 1. 싱글턴 패턴이란?

밥알이 2025. 5. 30. 23:03

✅ 목적:

하나의 클래스에 대해 오직 하나의 인스턴스만 존재하도록 보장하고,
어디서든 전역으로 접근 가능하게 만드는 패턴입니다.


📌 2. 언제 사용하나요?

  • 설정 클래스 (Config)
  • 로깅, 캐시, 데이터베이스 연결 객체
  • 공유 리소스를 관리할 때

🚫 예를 들어 볼게요:

Logger log1 = new Logger();
Logger log2 = new Logger();

log1.write("Hello");
log2.read(); // log1과 log2는 서로 다른 인스턴스니까 데이터 공유 안됨!

→ 로그가 따로 관리되면 안 되니까 하나의 Logger 인스턴스만 쓰게 만들어야 해요!


🎯 싱글턴 구현 핵심 포인트

  1. 생성자를 private으로 막기
  2. 내부에서 자기 자신을 static으로 한 번만 생성
  3. public static 메서드로 외부에서 접근하게 만들기

🔧 3. 실무형 자바 예제 (Thread-safe 버전)

public class AppConfig {
    // 1. static으로 유일한 인스턴스를 선언 (volatile: 메모리 동기화 보장)
    private static volatile AppConfig instance;

    // 2. private 생성자: 외부에서 생성 못 하게
    private AppConfig() {
        // 초기 설정 로딩 등
        System.out.println("AppConfig 인스턴스 생성됨");
    }

    // 3. synchronized + double-check 로 thread-safe 구현
    public static AppConfig getInstance() {
        if (instance == null) {
            synchronized (AppConfig.class) {
                if (instance == null) {
                    instance = new AppConfig();
                }
            }
        }
        return instance;
    }

    // 예시 메서드
    public void printConfig() {
        System.out.println("설정 출력: 시스템 설정 값");
    }
}

📁 사용 코드 예:

public class Main {
    public static void main(String[] args) {
        AppConfig config1 = AppConfig.getInstance();
        AppConfig config2 = AppConfig.getInstance();

        config1.printConfig();
        System.out.println("동일 인스턴스 여부: " + (config1 == config2)); // true
    }
}

✅ 실행 결과

AppConfig 인스턴스 생성됨
설정 출력: 시스템 설정 값
동일 인스턴스 여부: true

→ 두 객체는 실제로 같은 인스턴스입니다.


💡 실무 팁

방법특징스레드 안전사용 추천
Eager Initialization 미리 만들어 둠 O 단순할 때
Lazy Initialization 사용할 때 생성 X X
synchronized 안전하지만 느림 O O (작은 앱)
Double-checked locking (volatile) 안전 + 빠름 O ✅ 실무에서 많이 사용
Enum 방식 가장 안전 O ✅ 강력 추천
 

🚀 보너스: 가장 강력한 방식 (Enum 싱글턴)

public enum GlobalConfig {
    INSTANCE;

    public void printConfig() {
        System.out.println("Enum 방식 싱글턴 설정 출력");
    }
}

// 사용
GlobalConfig.INSTANCE.printConfig();
  • 자바가 Enum 은 직렬화, 리플렉션 우회도 막아줌
  • 거의 완벽한 싱글턴 보장 → 실무에서는 이 방식도 많이 써요

🎓 마무리 요약

싱글턴 장점싱글턴 단점
인스턴스 재사용으로 성능 ↑ 테스트 어려움 (의존성 주입 불편)
전역 접근 가능 전역 상태 남용 위험
자원 관리 쉬움 너무 많이 쓰면 코드 결합도 ↑
Comments