스파르타 내일배움캠프/Today I Learned

Today I Learned - Day 5 [싱글톤]

불면증 도사 2024. 9. 13. 20:49

싱글톤

싱글톤 자체는 본 캠프를 시작하자 마자 다루기 시작한 요소이긴 하나, 이번에는 이러한 싱글톤의 특징에 대해서 다뤄보려고 한다.

 

MonoBehaviour

MonoBehaviour에서 싱글톤을 생성하기 위해서는 다음 코드를 사용하면 된다.

public class GameManager : MonoBehavior
{
	public static GameManager instance;
	
	void Awake()
    {
    	if(instance == null)
        {
        	instance = this
        }
        
        else
        	Destroy(this.gameObject)
    }
}

여기에 씬의 이동에 관계 없이 유지하고싶다면 DontDestroyOnLoad(gameObject)를 instance = this 아래에 추가하면 된다.

 

이러한 Unity에서의 싱글톤은 해당 게임의 여러 스크립트에서 자유롭게, 편하게 참조가 가능하기 때문에 이런저런 방면에서 유용하게 쓰이고 있다.

 

하지만, 이러한 구성에는 상당히 큰 구멍이 있는데, 바로 일단 한번 인스턴스화 하지 않으면 싱글톤이 생성되지 않는다는 것. 즉, 이러한 싱글톤이 만들어지는 오브젝트를 적어도 한번은 켜야지 싱글톤이 유지가 된다는 것을 의미한다. 동시에 이 스크립트를 담고 있는 인스턴스가 제거되면 싱글톤도 같이 날라간다는 것도 난점.

추가로 DontDestroyOnLoad를 이용해서 씬에 관계 없이 유지된다는 것도 일단 이 싱글톤을 담고있는 객체가 유지가 되야지 가능한 것이기 때문에, 게임 진행에 중요한 역할은 하는 경우가 아니라면 꽤나 손해일 수 밖에 없다.

 

반대로, MonoBehavior을 통해서만 동작이 가능한 Unity 환경에서 게임 진행에 중요한 역할을 배정하기 편하다는 점은 확실한 장점이기 때문에 현재도 매우 활발하게 활용되고 있는 형태이기도 하다.

 

C#의 싱글톤

사실상 싱글톤의 원래 사용법에 해당한다. 일단 구현 방법 부터 작성하고 시작하겠다.

public class Singleton
{
    private static Singleton _instance;
    
    public static Singleton Instance();
    {
    	if(instance == null)
        {
        	_instance = new Singleton();
        }
        
        return _instance;
    }
}

간단하게 해설하자면,

전역변수이지만 private인 클래스를 하나 선언한 뒤, 이에 접근할 수 있는 함수를 작성한 구성이다.

그리고 만약 최초 접근이라면(_instance가 null이라면) 싱글톤용 클래스를 새로 만드는 구성.

 

만들고난 뒤의 사용법은 상술한 MonoBehavior에서의 사용법과 동일하다.

다만, 다른점은 이 클래스는 MonoBehavior가 아니라는 것. 즉, 인스턴스에서 담고 있을 필요가 없다.

때문에 MonoBehavior에서의 사용법보다 접근이 편하고, 이걸 담고 있는 객체를 유지할 필요가 없다. 동시에 씬 이동 시에도 변수를 유지할 수 있다는 점이 포인트.

대신 이 방법의 난점도 MonoBehavior가 아니라는 것인데, 간단하게 말해서 이 클래스는 게임에서 특정한 기능을 가지도록 만들기가 까다롭다. 즉, 평범한 변수 저장용으로나 쓸 만 하지, 이걸 게임의 중추로 쓰기에는 난감하다는 것.

 

정리하며

상기한 두 기법 모두 싱글톤이라는 같은 요소를 다룸에도 유니티에서는 양쪽의 역할이 완전히 다르다.

MonoBehavior에서의 싱글톤은 게임의 중추로서 활용하고, 일반 클래스로서의 싱글톤은 다른 씬 간의 이음매로 활용되기 때문이다.

때문에 어느 한 쪽만 알아둬서 될 것이 아니라, 양쪽 모두를 잘 알고 활용할 줄 알아야 더욱 다양한 작품을 제작할 수 있을 것이다.