내일배움캠프 25일차 TIL, 제네릭 싱글톤

황오영·2024년 5월 21일
0

TIL

목록 보기
25/56
post-thumbnail

제네릭 싱글톤

  • 오늘 챌린지반 과제진행중 제네릭 싱글톤에 대한 내용이 나와서 정리해 보았다.

    제네릭 싱글톤? 제네릭 + 싱글톤을 합쳐서!

  • 싱글톤 : 객체의 인스턴스가 오직 하나인 디자인패턴

  • Generic class : 데이터 형식을 일반화한 클래스

  • 보통 게임프로젝트를 진행하면 다양한 Manager들을 통해 다양하게 작업을 진행한다. 이러다보면 무수히 많은 Manager들이 필요하게 되는데 문제는 각자 사용하는 매니저 방식이 다르게 되면 코드의 정리가 힘들어진다.

  • 그래서 싱글톤은 제네릭화 시켜서 상속을 통해 다양한 매니저들을 구현한다.

using UnityEngine;

public class SingleTon<T> : MonoBehaviour where T : MonoBehaviour
{
	   private static T instance;

   public static T Instance
   {
       get
       {
           // get instance of singleton
           if (instance == null)
           {
               instance = FindObjectOfType<T>();
               if (instance == null)
               {
                   GameObject go = new GameObject
                   {
                       name = typeof(T).Name + "Managers"
                   };
                   instance = go.AddComponent<T>();
               }
           }
           return instance;
       }
   }

   public void Awake()
   {
       // make it as dontdestroyobject 
       if (instance == null)
       {
           instance = this as T;
           DontDestroyOnLoad(this.gameObject);
       }
       else
       {
           Destroy(this.gameObject);
       }
   }
}
  • Instance 프로퍼티에서 FindObjectOfType를 통해 인스터스를 찾고 없다면 생성해주는 get 코드를 작성한다. 오브젝트를 생성후 AddComponent를 통해 스크립트까지 추가

  • Awake에선 씬을 이동해도 파괴하지 않도록 DontDestroyOnLoad를 사용해준다. 혹시나 있다면 오브젝트를 파괴후 유일성을 보장

  • Instance 프로퍼티와 상속에서 제네릭을 사용하고 싱글톤의 보장은 awake쪽에서 같이 처리한다.

  • 이 싱글톤을 상속받아서 넘기기만 하면 끝!

public class AudioManager : Singleton<AudioManager>
{
    static AudioManager instance;
}
  • 이런식으로 T자리에 매니저 클래스와 이름을 넣어주면된다.
  • 나머지는 각 매니저에 맞게 코드 구현후 사용하면 끝!
  • 생각보다 패턴자체는 간단한데 제네릭 타입이 헷갈려서 잘 정리해두고 쓰면 좋을것같다. 다양한 매니저들은 꾸준히 사용하니까.

장단점은 없을까?

  • 장단점이 궁금해서 찾아봤는데 제네릭 싱글톤의 장단점 이라기보단 그냥 싱글톤의 장단점이 있어 가볍게 정리해 보았다.

장점

  1. 전역 접근성 : 데이터와 객체에 쉽게 접근 할 수 있다.
  2. 리소스 효율성 : 게임수명 주기 전반에 걸쳐 하나만을 보장하기에 데이터 구조등의 리소스를 많이 사용하는 개체에 유용하다.
  3. 간소화된 초기화 : 싱글톤을 사용하면 초기화 코드가 정확히 한번만 실행되기에 초기화 과정에서의 문제를 방지할 수 있다.
  4. 코드 유지 관리 : 깔끔하고 체계적인 코드 구조로인해 게임 개발 구조를 잘 정리할 수 있다.

단점

  1. 글로벌 상태 : 전역접근성이 장점이자 단점이다. 쉽게 접글할 수 있지만 관리하기 어려운 상태가 되버리니 종속성이 강하게 되버리는 상황이 될 수 있다.
  2. 긴밀한 결합 : 위와 비슷한 내용 쉽게 접근을 하기 떄문에 종속성이 강해질 위험이 있다. 독립적인 리팩토링과 수정이 힘들어 유연성과 모듈성을 떨어뜨린다.
  3. 테스트 과제 : 단위테스트가 힘들어진다 싱글톤톤 매니저에서 모든것을 처리하기 때문에 모듈화가 떨어져 기능테스트가 힘들다.
  4. 남용 : 싱글톤은 신중하게 쓰는것이 좋다. 너무 남용하면 스파게티 코드가 되기쉽다.
  5. 초기화 순서 : 객체의 초기화가 중요할 때가 있는데 종속된 싱글톤이 많아지면 초기화 순서를 알 수 없어 복잡한 작업이 될 수 있다.
  • 정리해 보니 싱글톤은 어찌보면 장단점이 같이 존재하는것같다는 생각이 들었다. 양날의 칼인느낌 조심해서 사용해야 할 필요성을 느꼈다. 편한만큼 대가를 지불하라는느낌?

오늘의 회고

  • 싱글톤은 대충 알고 있었는데 장단점을 정리하면서 느낀 단점들이 프로젝트를 하면서 느낀 문제점이랑 비슷해서 놀랐다. 요즘 프로젝트를 하면서 느끼는건 역시나 구조가 제일 어렵고 구조가 제일 문제라는 생각이들었다.
  • 그래서 프레임워크가 중요하고 구조가 중요하다는 생각이 들었다. 오늘 챌린지반 특강에서도 이런 프레임워크 다루는 얘기를 해주셨는데 물론 신입으로 들어가면 몇년동안 안쓴다고는 하셨지만 프레임워크 제작, 작업방식을 잘 지키는것이 중요하다고 느꼈다.
  • 싱글톤의 경우는 인프런 강의에서 쓰는 방식이랑 다르면서도 비슷해서 이거도 잘 알아둬서 대략적인 프레임워크 툴을 만들어서 앞으로의 프로젝트에도 활용 해야겠다고 생각했다! 더 열심히 공부해서 잘 해야지
  • 이벤트 델리게이트 액션 특강을 오늘 들었는데 역시 이런걸 잘 해야 구조 구성을 좀 더 잘 할수 있을것같다.. 힘내서 잘 정리해 놔야지 챌린지반 특강은 도움 많이되는것같다.
profile
게임개발을 꿈꾸는 개발자

0개의 댓글