본문 바로가기
카테고리 없음

싱글톤 패턴의 핵심 특징

by silvertogold100 2025. 8. 5.
반응형

싱글톤 패턴의 핵심 특징

기본 개념

  • 클래스의 인스턴스가 오직 하나만 존재하도록 보장
  • 전역적으로 접근 가능한 단일 접근점 제공
  • 인스턴스 생성을 클래스 자체에서 제어

주요 구성 요소

  1. private 생성자: 외부에서 직접 인스턴스 생성 방지
  2. static 인스턴스 변수: 유일한 인스턴스를 저장
  3. public static 메서드: 인스턴스에 접근하는 유일한 방법 (보통 getInstance())

구현 방식들

1. Eager Initialization (이른 초기화)

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

2. Lazy Initialization (지연 초기화)

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

장점과 단점

장점

  • 메모리 효율성: 하나의 인스턴스만 생성하여 메모리 절약. 특히 데이터베이스 연결처럼 생성 비용이 큰 객체에 유용
  • 전역 접근: 어디서든 동일한 인스턴스에 접근 가능. 애플리케이션의 어느 곳에서나 동일한 인스턴스에 쉽게 접근할 수 있음. 예를 들어, 애플리케이션의 설정을 담은 객체를 싱글톤으로 만들면, 모든 모듈이 동일한 설정 정보를 공유
  • 자원 공유: 공통 자원(DB 연결, 설정 등)을 효율적으로 관리

단점

  • 테스트 어려움: 전역 상태로 인한 단위 테스트 복잡성. 테스트를 할 때마다 초기화해주거나 예상치 못한 상태 변경을 막기 어려워 테스트 코드를 작성하기 복잡.
  • 의존성 숨김: 클래스 간 의존관계가 명확하지 않음. 싱글톤 객체에 직접 의존하게 되면 객체 간의 결합도가 높아집니다. 만약 나중에 싱글톤 패턴을 사용하지 않는 방향으로 변경하려면 코드 전체를 수정해야 할 수도 있음.
  • 멀티스레드 문제: 동시성 처리 시 복잡성 증가. 여러 스레드가 동시에 getInstance() 메서드를 호출할 경우, 예상치 못하게 여러 개의 인스턴스가 생성될 수 있는 위험이 있음. 멀티스레드 환경을 고려한 동기화 처리가 필요
  • 확장성 제한: 상속이나 다형성 활용이 어려움

적용 사례

적합한 경우

  • 설정 관리자: 애플리케이션 전역 설정. 애플리케이션의 환경 설정(예: API 키, 데이터베이스 주소)을 담고 있는 객체는 모든 모듈이 동일한 설정을 참조해야 하므로 싱글톤으로 만드는 것이 적합.
  • 로거: 로그 기록 관리. 애플리케이션의 모든 로그를 한 곳에 기록하는 로거는 하나의 인스턴스만 있으면 충분합니다. 여러 로거 인스턴스가 각기 다른 파일에 기록하는 것은 관리하기 어렵기 때문
  • 캐시 매니저: 메모리 캐시 관리. 
  • 하드웨어 인터페이스: 프린터, 파일 시스템 접근

주의사항

  • 정말 전역에서 하나의 인스턴스만 필요한지 신중히 검토
  • 의존성 주입(Dependency Injection) 같은 대안도 고려
  • Spring 같은 프레임워크에서는 컨테이너가 싱글톤을 관리해주므로 직접 구현할 필요가 적음

싱글톤은 강력하지만 남용하면 코드의 유연성과 테스트 가능성을 해칠 수 있으므로, 정말 필요한 경우에만 사용하는 것이 좋습니다.

반응형