싱글톤이란?

  • 싱글톤은 전역 변수를 사용하지 않고 객체를 하나만 생성 하도록 함
  • 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴
  • 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나
  • 최초 생성 이후에 호출된 생성자는 최초에 생성자가 생성한 객체를 리턴

싱글톤의 특징

  • 고정된 메모리 영역을 얻으면서 동시에 단 한번만 인스턴스가 생성되기 떄문에 메모리 낭비를 방지
  • 싱글톤으로 만들어진 인스턴스는 전역으로 사용되기때문에 다른 클래스의 인스턴스들이 데이터를 공유하고 변경 가능
  • 너 많은 일을 위임할 경우 결합도가 높아지는 문제 존재

싱글톤패턴의 주의점

  • 상태를 가진 객체를 Singleton으로 만들면 안됨
  • 상태가 공유된다는 것은 이를 전역에서 접근할 수 있다는 것
  • 각기 다른 스레드에서 객체의 상태를 마구잡이로 변경할 시 문제 발생 가능성 존재
  • 무상태 객체 or 설계상 유일해야하는 시스템 컴포넌트를 Singleton으로 만들어야함

싱글톤은 안티패턴?

  • SOLID 원칙의 대부분은 인터페이스 설계와 관련이 되어있음
  • Singleton을 사용하는 경우 대부분 구현 클래스의 객체를 미리 생성해 놓고 정적메소드를 이용하여 이를 구현하게 되므로 SOLID 원칙을 위반 할 가능성 존재 + Singleton을 사용하는 곳과 Singleton class 사이에 의존성이 생김 -> 결합도를 높이므로 수정 및 단위테스트의 어려움이 증가

객체지향의 의도와 맞지 않는다.

  • Singleton의 사용은 Global state를 만들 수 있기 때문에 바람직하지 x
  • 아무 객체나 자유롭게 접근, 수정, 공유할 수 있는 전역 상태를 갖는 것이 객체지향 프로그래밍에서 지양되어야 할 모델

리팩토링에서의 영향도가 프로그램 ‘전체’가 된다.

  • Singleton으로 이루어진 객체가 변경이 일어나면 이를 사용하는 모든 서비스들에게 변경 전파가 이루어짐 -> 영향도가 어플리케이션 전체

싱글톤 패턴의 대안 - 의존성 주입(dependency injection)

  • 의존성 주입의 가장 중요한 장점은 투명성 > 싱글톤의 장점인 편의성
  • 코드 기반의 명확성을 더해주기 때문에 어떤 객체가 어떤 객체에 의존하고 있는지를 정확하게 나타냄
  • 타입의 요구사항을 정의하기 위한 매우 유용한 도구

결론

  • 싱글톤 객체는 아무데서나 마음대로 접근하라고 만든 객체가 아니고 편리함이 목적이 아니라 어떤 시점에도 클래스의 인스턴스가 단 하나만 존재하도록 보장하는 것 -> 매우 제한적으로 사용해야 유리

댓글남기기