관리 메뉴

기억을 위한 기록들

[GPP]싱글턴 본문

디자인 패턴 ( Design Pattern )/게임프로그래밍 패턴

[GPP]싱글턴

에드윈H 2023. 2. 2. 22:13
"오직 한개의 클래스 인스턴스만을 갖도록 보장하고, 이에 대한 전역적인 접근점을 제공합니다."
(보통 '한개의 클래스 인스턴스'와 '전역접근' 중에서 보통은 '전역 접근'이 싱글턴 패턴을 선택하는 이유이다.)

싱글턴 패턴은 의도와는 달리 득보다는 실이 많다. 부적당한 곳에서 사용하면 쓸모가 없다.

 

싱글턴 패턴이란?

 

  • 오직 한 개의 클래스 인스턴스만 갖도록 보장

클래스가 인스턴스를 하나만 가지도록 컴파일 단계에서 강제.

 

  • 전역 접근점을 제공

로깅, 콘텐츠 로딩, 게임 저장 등 여러 내부 시스템에서 파일 시스템 래퍼 클래스를 사용할 것이다.

ex)파일 시스템 클래스 인스턴스를 따로 생성 할 수 없다면, 파일 시스템에는 어떻게 접근해야할까?

여기에 대한 해결책도 제공한다. 하나의 인스턴스만 생성하는 것에 더해서, 싱글턴은 그 인스턴스를 전역에서 접근할 수 있는 메서드를 제공한다. 이를 통해서, 누구든지 어디서든지 우리가 만든 인스턴스에 접근할 수 있다.

 

 

왜 싱글턴을 사용하는가?

  •  한번도 사용하지 않는다면 아예 인스턴스를 생성하지 않는다.
  • 런타임에 초기화한다.
  • 싱글턴을 상속할 수 있다.(다양한 플랫폼마다 구체 클래스를 만들 수 있다.)

 

 

왜 싱글턴이 문제지?

  • 알고보니 전역 변수. 전역변수가 나쁘다는 것인데, 이유는 다음과 같다.
  • 전역 변수는 코드를 이해하기 어렵게한다.
  • 전역 변수는 커플링을 조장한다.
  • 전역 변수는 멀티스레딩 같은 동시성 프로그래밍에 알맞지 않다.

 

싱글턴은 치료제보다는 진정제에 가깝다. 

대안

  • 클래스가 꼭 필요한가? 서툴게 만든 싱글턴은 다른 클래스에 기능을 더해주는 '도우미'인 경우가 많다.
  • 오직 한 개의 클래스 인스턴스만 갖도록 보장하기
  • 인스턴스에 쉽게 접근하기
  • 객체를 필요로 하는 함수에 인수로 넘겨주는게 가장 쉬우면서도 최선인 경우가 많다.
  • 상위 클래스로부터 얻기
  • 이미 전역인 객체로부터 얻기
  • 서비스 중개자로부터 얻기

싱글턴을 대체할 패턴 

  • 샌드박스 패턴 : 클래스가 같은 인스턴스들이 공용상태를 전역으로 만들지 않고도 접근할 수 있는 방법을 제공
  • 서비스 중개자 패턴 : 객체를 전역으로 접근할 수 있게 하되, 객체를 훨씬 유연하게 설정할 수 있는 방법 제공 

'디자인 패턴 ( Design Pattern ) > 게임프로그래밍 패턴' 카테고리의 다른 글

[GPP]상태 패턴  (0) 2023.02.02
[GPP]프로토타입 패턴  (0) 2023.02.02
[GPP]컴포넌트 패턴  (0) 2023.02.02
[GPP]경량 패턴  (0) 2023.01.29