개발하는 리프터 꽃게맨입니다.

[C++/디자인패턴] 싱글톤 (Singletone) 본문

기타 개발 지식/디자인패턴

[C++/디자인패턴] 싱글톤 (Singletone)

파워꽃게맨 2024. 1. 27. 20:08

개요

싱글톤 패턴은 하나의 클래스가 하나의 객체만 가지도록 하면서 이 객체에 대한 접근은 전역으로 제공하는 디자인 패턴 입니다.

 

게임을 만들 때 오브젝트를 관리하거나, 씬을 관리할 때 주로 싱글톤 패턴을 사용합니다.

전역적으로 접근할 수 있고, 하나의 객체만 존재하니 필요할때 객체에 접근해서 꺼내쓰는 것이죠.

 

리소스 관리, 데이터 공유가 필요할 때 사용하면 좋은 패턴입니다.

 


싱글톤 패턴

1) 개요

싱글톤 패턴은 클래스의 객체가 오직 하나만 생성되도록 보장합니다.

이 패턴은 단일 데이터베이스 객체처럼, 모든 객체에서 이용할 수 있는 단일 인스턴스가 필요할 때만 사용해야합니다.

 

2) 기본 구조

 

싱글톤 메소드 내부에서 getInstance 라는 static 함수를 선언합니다.

이 메소드는 자기 자신의 static 객체를 반환합니다.

 

이때, 생성자는 private: 처리를 하여 없애주는 것이 싱글톤의 의의와  맞습니다.

 

3) 예시

아래 코드는 아이템을 저장하는 Manager class 입니다.

플레이어는 언제든지 인벤토리를 열어서 아이템을 가지고 올 수 있어야하기 때문에

그리고 또 인벤토리는 하나의 프로그램에 단 하나만 존재해야하기 때문에 싱글톤으로 설계했습니다.

 

간단하게 아이템을 저장하고, 뱉어내는 기능을하는 싱글톤 클래스입니다.

위 방법은 Lazy Initialization 이라고 부르며, 싱글톤 클래스를 사용하지 않을 때 메모리를 사용하지 않는다는 장점이 있습니다.

단, 쓰레드 safe 하지 않습니다.

 

 

이런 식으로 만드는 방법도 존재합니다.

이는 Eager Initialization 이라고 하며, 가장 직관적이면서도 심플한 기법입니다.

단, 당장 객체를 사용하지 않더라도 메모리에 적재하기 떄문에 공간 자원을 낭비한다는 단점이 있습니다.

 

 

4) 장단점

장점

(1) 인스턴스에 대한 전역 접근 가능

(2) 클래스가 명백하게 하나의 인스턴스만 가짐

 

단점

(1) 모듈간 의존성이 높아집니다.

어떤 클래스라도 해당 클래스에 접근할 수 있으니 싱글톤과 다른 클래스 사이에는 강한 의존성이 생기게 됩니다.

 

(2) 단일 책임 원칙을 위배한다.

싱글톤 자체가 여러가지 책임을 지니게 되는 경우가 많이 때문에 단일 책임 원칙을 위반합니다.

 

그래서 싱글톤 패턴 자체를 OOP의 안티 패턴이라고 불리기도 하죠.