- 싱글턴: 싱글턴은 단 하나의 객체만 만들어서 사용하는 디자인 패턴이에요. 마치 하나뿐인 대통령처럼, 프로그램 전체에서 딱 하나의 인스턴스만 존재해야 할 때 사용하죠. 예를 들...
1. 🎮 싱글턴 패턴의 유일성

-
싱글턴 패턴은 객체의 유일무이한 인스턴스를 생성하여 오직 하나만 존재하게 만든다.
-
유니티에서 예로 들면, 스피커가 여러 개 생성되지만 실행 후에는 하나의 스피커만 남는 방식으로 작동한다.
-
'Don't Destroy On Load' 설정을 통해 게임 씬이 변경되더라도 객체가 계속 유지될 수 있다.
2. ⚙️ 싱글턴 패턴의 정의와 사용 사례

-
싱글턴 패턴은 클래스가 자신의 인스턴스를 오직 하나만 생성하도록 보장하는 패턴이다.
-
이 패턴은 단일 인스턴스에 대한 쉬운 접근을 제공하며, 여러 곳에서 접근 가능하게 해준다.
-
게임 개발에서는 게임 매니저와 같은 다양한 매니저 클래스에서 널리 사용되며, UI 세팅에도 적용 가능하다.
-
그러나 싱글턴 패턴은 종속성 문제를 야기할 수 있어 안티 패턴으로 취급되기도 하며, 사용 시 주의가 필요하다.
-
이 패턴은 테스트 및 디버깅을 어렵게 만들고, 객체 관리를 복잡하게 할 수 있다.
3. 🛠️ 싱글톤 패턴의 기본 구현

-
싱글톤 패턴은 클래스가 자기 자신의 인스턴스를 스태틱으로 보유하게 하여, 여러 인스턴스가 생성되더라도 하나의 인스턴스만 존재하도록 만든다.
-
인스턴스가 존재하지 않을 경우, 호출 시 새 인스턴스를 생성하고 반환하지만, 이미 인스턴스가 존재할 경우 해당 인스턴스를 사용하게 된다.
-
유니티에서 모노비헤이비어를 사용할 경우, 새로운 씬을 불러오면 게임 오브젝트가 삭제되어 싱글톤 인스턴스가 사라지는 문제가 발생한다.
-
이 문제를 해결하기 위해, 인스턴스가 없을 경우 새로 만들어주거나 기존 인스턴스를 유지하는 코드를 추가해야 한다.
-
기본적으로 싱글톤은 객체가 파괴되지 않고 유지될 수 있도록 구현되어야 한다.
4. 🎮 싱글톤 패턴의 활용과 제네릭

-
싱글톤 패턴은 게임 매니저, 오디오 매니저, UI 매니저 등 여러 관리자를 위해 사용된다.
-
기본적인 구현으로는 여러 매니저 객체를 생성하기 어려우므로, 제네릭을 활용한 방법이 필요하다.
-
제네릭을 사용하면 코드가 약간의 변화만으로 다양한 매니저를 싱글톤 형태로 만들 수 있다.
-
각 매니저는 부모 클래스를 상속받아 싱글톤으로 생성될 수 있으며, 이로 인해 다양한 매니저를 손쉽게 사용할 수 있다.
-
제네릭 사용은 코드의 복잡성을 줄이고 여러 싱글톤을 더 효율적으로 관리할 수 있게 한다.
5. 🛠️ 멀티스레드 환경에서의 싱글턴 패턴 문제점과 해결책

-
멀티스레드 환경에서는 두 개의 스레드가 동시에 인스턴스를 생성할 수 있어, 스레드 안전하지 않은 문제가 발생할 수 있다.
-
이를 해결하기 위해 락(lock)을 사용하면, 하나의 스레드가 리소스를 점유하고 있을 때 다른 스레드는 대기하게 되어 스레드 안전한 구역이 생성된다.
-
인스턴스를 두 번 체크하는 방식은 스레드 간의 경합 상황을 방지하기 위한 방법으로, 널 체크를 통해 문제가 발생할 가능성을 줄인다.
-
볼래틸리티(volatile) 키워드는 멀티스레드 환경에서 메모리 접근을 안정적으로 처리하도록 도와주지만, 캐시 최적화 측면에서는 단점이 있다.
-
멀티스레드 환경에서의 싱글턴 생성은 스태틱 초기화를 통해 이루어짐으로써, 최초 호출 시 자동으로 인스턴스가 생성되며, 이 경우 완전히 스레드 안전하다고 볼 수 있다.
6. 🛠️ 싱글턴 패턴의 개념과 주의사항

-
싱글턴은 클래스의 인스턴스가 하나만 존재하도록 보장하는 개념이다.
-
하지만 싱글턴 패턴은 안티 패턴으로 취급되기도 하며, 테스트가 불편할 수 있기 때문에 필요한 경우에만 조심해서 사용해야 한다.
-
싱글턴을 편리하게 사용하면 커플링이 발생하기 쉽고, 디버깅이 어려워지며 메모리 관련 문제가 발생할 수 있다.
-
따라서 싱글턴 사용은 필수적인 로직에서만 추천된다.