본문 바로가기
CS

[Design Pattern] 싱글톤(Singleton) 패턴

by 차가운개발 2024. 11. 26.

싱글톤 패턴은 간단하게 말하면 객체의 인스턴스를 한개만 생성되게 하는 패턴이다.

생성자를 여러 번 호출하더라도 인스턴스가 하나만 존재하도록 보장한다.

 

즉 아래와 같은 상황에서 사용한다.

  • 프로그램 내에서 하나의 객체만 존재해야 한다.
  • 프로그램 내에서 여러 부분에서 해당 객체를 공유하여 사용해해야 한다.

ㅇ 싱글톤 패턴의 장단점 

장점

  • 유일한 인스턴스
    애플리케이션 전역에 단 하나의 인스턴스만 존재하도록 보장한다.
    객체의 일관된 상태를 유지하고, 전역에서 접근 가능하여 공유 자원의 관리를 편하게 한다.
  • 메모리 절약
    생성자를 여러 번 호출하여도 새로운 인스턴스를 생성하지 않아 메모리 점유 및 해제에 대한 비용을 줄인다.
  • 지연 초기화
    필요할 때만 객체를 생성하여 초기화 비용을 줄일 수 있다. 
    애플리케이션 시작 시 불필요한 자원 소모를 방지할 수 있다.

단점

  • 결합도 증가
    전역에서 접근이 가능하기 때문에 해당 인스턴스에 의존하는 경우 결합도가 증가한다.
  • 테스트 복잡성
    싱글톤 클래스를 의존하는 클래스들의 결합도 증가로 테스트가 어려울 수 있다.
  • 상태 관리의 어려움
    만약 싱글톤 클래스가 상태를 가지고 있는 경우, 전역에서 사용되어 변경될 수 있다.
    이로 인해 예상치 못한 동작이 발생할 수 있다.
  • 전역에서 접근 가능
    전역에서 접근하기 때문에 무분별한 사용을 막기 힘들다 이로 인해 변경에 대한 복잡성이 증가할 수 있다.

 

ㅇ 싱글톤 패턴의 구현

싱글톤 패턴의 구현 조건

  • new 키워드를 사용할 수 없도록 생성자에 private 접근 제어자를 지정한다.
  • 유일한 단일 객체를 반환할 수 있는 정적 메서드가 필요하다.
  • 유일한 단일 객체를 참조할 정적 참조 변수가 필요하다.

 

구현코드

 

 

사용

 

출력

 

위 코드의 경우 멀티 스레드 환경에서 Thread Safe하지 않는 문제점이 있다.

쓰레드가 A와 B가 있다고 가정할 때 

 

A가 getInstance의 if문을 통과하고 객체를 생성하기 직전에

B가 if문을 통과해버리면 2번의 초기화가 일어날 수 있다.

 

Thread Safe를 보장하기 위한 방법

 

  • sychronized 키워드 사용
    하나의 스레드만 접근 가능하도록 한다.
    여러 스레드가 접근하려할 때 Lock으로 인한 성능 저하가 발생할 수 있다.
  • Bill Pugh Solution 사용
    내부 클래스를 활용하여 구현하는 방법
  • Enum 클래스 사용
    상속이 불가능한 문제점이 있다.

'CS' 카테고리의 다른 글

[Design Pattern]팩토리 메서드 패턴  (0) 2024.11.26
[Design Pattern] 템플릿 메서드 패턴  (0) 2024.11.26
CS 알고리즘 시간복잡도  (0) 2024.10.07
CS 오토 스케일링(Auto Scaling)이란  (0) 2024.09.19
CS Cloud VS On-Premise  (3) 2024.09.10