본문 바로가기

소프트웨어/C# + Unity

[C#_Unity]싱글톤 방법(Singleton)



유니티에서 가장 많이 사용하는 기법인 싱글톤(Singleton) 방법에 대해서 알아보자


우선 싱글톤을 이해하기 위해서는 static이라는 예약어가 어떤 역할을 하는지 알아봐야 한다.


모든 객체 인스턴스들이 하나의 멤버변수를 공유할 필요가 있다면 어떻게 해야 할까?


정답은 static(정적)을 사용하면 된다. 


static으로 선언한 멤버는 힙영역이 아닌 메모리 공간에 할당되며 몇개의 객체를 생성하던지 상관 없이 프로그램이 끝날 동안 클래스당 한 번만 


메모리에 할당을 한다.


아래 예제를 보면 이해가 갈 것이다. 




class 싱글톤

{

    static int _stmember=3; //정적 멤버 필드

 

    public static int STMember //정적 멤버 속성

    {

        get{   return _stmember;   }

    }

 

    int _dynmember= 2; //인스턴스 멤버 필드

 

    public int DynMember //인스턴스 멤버 속성

    {

        get{    return _dynmember;    }

    }

}

 

 



class 메인

{

    static void Main(string[] args)

    {

        int_stmember = Example.STMember ; //객체 생성 없이도 다음과 같이 클래스명으로 접근가능

        Console.WriteLine("싱글톤.STMember:{0}"_stmember);

 

        싱글톤A = new 싱글톤();

        int _dynmember = A.DynMember //객체 생성을 통한 접근

        Console.WriteLine("A.DynMember :{0}"A.DynMember );

    }

}


▶ 실행 결과

싱글톤.SM:3

A.DynMember :2






이해가 되었는가? 이해가 되지 않았다면 이렇게 생각해보자.


싱글톤에서 느껴지듯이 하나만 있어야 한다. static으로 설정을 하면 메모리 상에 하나만 만들어진다고 말했다. 여러개의 객체를 만들어도 하나만 만들어진다. 즉 여러개의 객체를 만들 필요가 없다는 것은 하나만 있어도 된다는 것이다. 즉 유니티에서 각각의 캐릭터들을 통합하여 컨트롤 하는 클래스의 경우 여러개가 만들어질 이유가 없기 때문에 바로 싱글톤 방법을 사용하는 것이다.


이렇게 만들어진 싱글톤을 다른 클래스에서도 사용해보려고 한다며?


public class Manager : MonoBehaviour

{

    private static Manager _instance = null;

    public static Manager Instance { get { return _instance; } }


private int _score = 0;

public int Score

    {

        get

        {

            return _score;

        }


    }

}



다른 클래스에서 Manager.Instance.Score로 접근이 가능하다는 것이다. 앞에서 말한 것처럼 이런 방법은 유니티(unity)에서 매니징을 하는 클래스에서 보통 정의 해서 사용한다는 점을 기억하자.