본문 바로가기

Unity

[Unity3D]Singleton 패턴 인터페이스로 써보기

1. 서론

본 글은 Interface의 이해와 제너릭클래스(템플릿)에 대한 이해가 필요하므로 구체적인 설명이 들어갈 수도, 없을 수 도 있으니, 양해 부탁드립니다.

 

간단히 코드만 넣어 활용방법만 설명 하려 했으나 말이 길어져 설명을 할수도 있을겁니다.ㅋㅋㅋ

 

필자는 매번 매니저를 만들때마다 유니티에서 Awake부분에 생성하고 static걸고 하는게 귀찮았습니다.

그리고 개발자가 죄다 중구난방으로 개발하는 꼴이 보기 싫었습니다.

그래서 그냥 제가 이걸로 쓰라고 만들었습니다.

 

이 방식이 효율적일 수도 있고, 비 효율적일 수 도있으나,

참고정도로만 봐 주시고, 이렇게도 쓰는 놈이 있구나 정도로만 생각 해주시면 감사하겠습니다.

 

아무쪼록 악플 달지말란 소리

2. 본론

그냥 저는 사용법이 얼마나 간단한지에 대해 먼저 설명할겁니다.

이거 보고 쓸만하면 참고하시고 아니면, 광고누르... 뒤로 가시면 됩니다. 찡긋

    public class Test : JHYSingleton<Test>
    {
        private void Awake()
        {
            CreateSingle(this, this.gameObject);
        }

        private void Update()
        {
            if (Input.GetKeyDown(KeyCode.Q))
            {
                Test q = Test.instance;
            }   
         }
     }

맨 윗줄 public class Test : JHYSingleton<'클래스네임'> 을 상속받고 있습니다.

딱 봐도 이 클래스는 싱글턴인걸 바로 인지 시켜주기도 하면서 프로그래머의 바보같은 실수를 줄일 수 있도록 하였습니다. 뿌듯^^

 

우선 Awake() 를 보시면 CreateSingle();이 적혀있습니다. 그냥 넣고 만들면 됩니다.

그럼 Test클래스는 싱글턴이 된겁니다. 아니 그럼 Mono가 없는데 어떻게 하이어라키에다가 넣느냐!? 하실 수 있습니다.

아래를 보시죠.

    //싱글턴이 가져야 할 기본적인 함수 정의
    interface JHYISingleton<T> where T : class
    {
        void CreateSingle(T _class, GameObject _obj);
    }

사용자의 싱글턴이 기능마다 혹은 개발자의 취향마다 클래스 안에 더 뭔가 기본적으로 추가 될 것들이 있을 수 있겠다 생각이 들었습니다.

그래서 interface로 싱글턴을 강제시키고 그 후에 추가 되는 내용들을 적었으면 했습니다.

 

그래서 만든것이 저 인터페이스 인것이죠. where문을 이용하여 T 자리에 class임을 강제 시키고 있습니다. 이 역시 실수를 방지하고자 넣은것이니 뭐 딱히 어렵게 생각 하지 않으셔도 됩니다.

 

    //싱글턴 기능 재정의 및 기능 구현
    //상속받아서 쓰면 다 싱글턴처럼 사용 가능
    public class JHYSingleton<T> : MonoBehaviour, JHYISingleton<T> where T : class
    {
        public static T instance = default; 
        public void CreateSingle(T _class, GameObject _obj)
        {
            if (instance == null)
            {
                instance = _class;
            }
            else if (instance.Equals(_class))
            {
                Destroy(_obj);
            }
            
            DontDestroyOnLoad(_obj);
        }
    }

 

핵심입니다. 구현부죠. 가장 윗줄에 어떤 클래스가 와도 인스턴스가 적용 되도록 T로 제너릭을 걸었습니다. 뒤에 눈에 익은 Mono도 보입니다. 그 뒤로 Interface JHY I Singleton 도 보입니다. 절대 같은 글자 아닙니다 I 가 들어갔습니다.

where로 T자리 역시 class로 고정 시켜주었군요.

클래스의 코드 내용은 간단합니다 static으로 자기 자신을 가지고 있고, interface에서 강제했던 CreateSingle()의 함수를 완성 시켜주었습니다.

 

잘 작동 합니다.

그림1. 결과

3. 결론

글 쭉 보시고 괜찮다 안좋다 하는 점 댓글로 의견 공유해주시면 감사하겠습니다.

 

 

어멋~ 고객님! C# Mono없는 버전도 있습니다 보고 가시죠~

 

[C#]Singleton패턴 상속으로 사용하기 feat.Interface

1. 서론 설명은 유니티 글에 자세히 적어두었습니다. 게시글 맨 아래입니다. 고객님 2. 본론 코드만 바로 보겠습니다. public class Test2 : JHYSingletonNotUsedMono { public Test2() { CreateNotUsedMon..

s-sense.tistory.com