[유니티 TIPS] 유일무이한 객체 인스턴스가 필요하다면? Singleton 패턴 | 프로그래밍 디자인패턴, 요약정

이 영상에서는 싱글턴 패턴의 특징과 유니티에서의 활용에 대해 다룹니다. 이 패턴은 특정 객체의 유일무이한 인스턴스를 보장해주며, 게임 매니저와 UI 설정 등 다양한 분야에 적용될 수 있습니다. 하지만 모든 곳에 접근 가능하다는 점 때문에 안티 패턴으로 간주될 수 있는 단면도 있습니다. 특히 멀티스레드 환경에서는 코드 안전성과 캐시 최적화 문제로 인해 주의가 필요하며, 잘못 사용하면 복잡성과 디버깅 문제를 초래할 수 있습니다. 이러한 복잡성을 피하기 위해서는 상황에 맞게 신중하게 싱글턴을 사용해야 함을 강조합니다.
핵심 용어
  • 싱글턴: 싱글턴은 단 하나의 객체만 만들어서 사용하는 디자인 패턴이에요. 마치 하나뿐인 대통령처럼, 프로그램 전체에서 딱 하나의 인스턴스만 존재해야 할 때 사용하죠. 예를 들...

1. 🎮 싱글턴 패턴의 유일성

  • 싱글턴 패턴은 객체의 유일무이한 인스턴스를 생성하여 오직 하나만 존재하게 만든다.

  • 유니티에서 예로 들면, 스피커가 여러 개 생성되지만 실행 후에는 하나의 스피커만 남는 방식으로 작동한다.

  • 'Don't Destroy On Load' 설정을 통해 게임 씬이 변경되더라도 객체가 계속 유지될 수 있다.

 

2. ⚙️ 싱글턴 패턴의 정의와 사용 사례

  • 싱글턴 패턴은 클래스가 자신의 인스턴스를 오직 하나만 생성하도록 보장하는 패턴이다.

  • 이 패턴은 단일 인스턴스에 대한 쉬운 접근을 제공하며, 여러 곳에서 접근 가능하게 해준다.

  • 게임 개발에서는 게임 매니저와 같은 다양한 매니저 클래스에서 널리 사용되며, UI 세팅에도 적용 가능하다.

  • 그러나 싱글턴 패턴은 종속성 문제를 야기할 수 있어 안티 패턴으로 취급되기도 하며, 사용 시 주의가 필요하다.

  • 이 패턴은 테스트 및 디버깅을 어렵게 만들고, 객체 관리를 복잡하게 할 수 있다.

 

3. 🛠️ 싱글톤 패턴의 기본 구현

  • 싱글톤 패턴은 클래스가 자기 자신의 인스턴스를 스태틱으로 보유하게 하여, 여러 인스턴스가 생성되더라도 하나의 인스턴스만 존재하도록 만든다.

  • 인스턴스가 존재하지 않을 경우, 호출 시 새 인스턴스를 생성하고 반환하지만, 이미 인스턴스가 존재할 경우 해당 인스턴스를 사용하게 된다.

  • 유니티에서 모노비헤이비어를 사용할 경우, 새로운 씬을 불러오면 게임 오브젝트가 삭제되어 싱글톤 인스턴스가 사라지는 문제가 발생한다.

  • 이 문제를 해결하기 위해, 인스턴스가 없을 경우 새로 만들어주거나 기존 인스턴스를 유지하는 코드를 추가해야 한다.

  • 기본적으로 싱글톤은 객체가 파괴되지 않고 유지될 수 있도록 구현되어야 한다.

 

4. 🎮 싱글톤 패턴의 활용과 제네릭

  • 싱글톤 패턴은 게임 매니저, 오디오 매니저, UI 매니저 등 여러 관리자를 위해 사용된다.

  • 기본적인 구현으로는 여러 매니저 객체를 생성하기 어려우므로, 제네릭을 활용한 방법이 필요하다.

  • 제네릭을 사용하면 코드가 약간의 변화만으로 다양한 매니저를 싱글톤 형태로 만들 수 있다.

  • 각 매니저는 부모 클래스를 상속받아 싱글톤으로 생성될 수 있으며, 이로 인해 다양한 매니저를 손쉽게 사용할 수 있다.

  • 제네릭 사용은 코드의 복잡성을 줄이고 여러 싱글톤을 더 효율적으로 관리할 수 있게 한다.

 

5. 🛠️ 멀티스레드 환경에서의 싱글턴 패턴 문제점과 해결책

  • 멀티스레드 환경에서는 두 개의 스레드가 동시에 인스턴스를 생성할 수 있어, 스레드 안전하지 않은 문제가 발생할 수 있다.

  • 이를 해결하기 위해 락(lock)을 사용하면, 하나의 스레드가 리소스를 점유하고 있을 때 다른 스레드는 대기하게 되어 스레드 안전한 구역이 생성된다.

  • 인스턴스를 두 번 체크하는 방식은 스레드 간의 경합 상황을 방지하기 위한 방법으로, 널 체크를 통해 문제가 발생할 가능성을 줄인다.

  • 볼래틸리티(volatile) 키워드는 멀티스레드 환경에서 메모리 접근을 안정적으로 처리하도록 도와주지만, 캐시 최적화 측면에서는 단점이 있다.

  • 멀티스레드 환경에서의 싱글턴 생성은 스태틱 초기화를 통해 이루어짐으로써, 최초 호출 시 자동으로 인스턴스가 생성되며, 이 경우 완전히 스레드 안전하다고 볼 수 있다.

 

6. 🛠️ 싱글턴 패턴의 개념과 주의사항

  • 싱글턴은 클래스의 인스턴스가 하나만 존재하도록 보장하는 개념이다.

  • 하지만 싱글턴 패턴은 안티 패턴으로 취급되기도 하며, 테스트가 불편할 수 있기 때문에 필요한 경우에만 조심해서 사용해야 한다.

  • 싱글턴을 편리하게 사용하면 커플링이 발생하기 쉽고, 디버깅이 어려워지며 메모리 관련 문제가 발생할 수 있다.

  • 따라서 싱글턴 사용은 필수적인 로직에서만 추천된다.