유니티 제너릭

Lee Hyeuk Jin·2023년 12월 25일

개념공부 및 실습

목록 보기
6/12

제너릭

제너릭은 특정한 데이터 형식에 종속되지 않고 다양한 데이터 형식에 대해 작동할 수 있는 코드를 작성하는 
기술이다. 제너릭은 코드의 재사용성과 유연성을 높여준다.

제너릭 예시 코드

using System;

internal class Program
{
    public class Example<T>
    {
        public T Data { get; set; }


        public void print()
        {
            Console.WriteLine(Data);
        }
    }




    class MainApp
    {
        static void Main()
        {
            Example<int> int_Example = new();
            Example<string> string_Example = new();
            Example<bool> bool_Example = new();


            int_Example.Data = 1;
            string_Example.Data = "a";
            bool_Example.Data = true;

            int_Example.print();
            string_Example.print();
            bool_Example.print();



        }
    }
}

유니티에서 제너릭 활용시 고려사항

	1. 가비지 컬렉션
    	- 가비지 컬랙션이 발생할 때 메모리 할당과 해체가 발생하면 성능에 영향을 끼칠 수 있다.
        - 제너릭을 사용할때 박싱과 언박싱이 발생할 가능성이 있어 이로인한 가비지 컬랙션을 줄이는 것이 중요하다.
    2. 메모리 사용량
    	- 제너릭을 사용하면 컴파일 시간에 코드가 생성되기 때문에 불필요한 형식이 코드에 포함될 수 있다. 이는 메모리 사용량을 증가시킬 수 있다.
    
    제너릭을 사용하면 이런 부분을 고려해야 하지만 대부분의 경우 성능에 영향을 끼치지 않는다.

유니티에서 제너릭 사용 예시

  • 유니티에서 제너릭을 사용한 대표적 예시는 싱글톤 클래스가 있다.

    싱글톤

    • 싱글톤은 특정 클래스의 인스턴스가 단 하나만 생성되도록 보장하는 패턴이다.
    • 싱글톤 패턴은 유일한 인스턴스가 필요하거나 전역적인 접근이 필요한 경우 사용된다.

유니티에서 제너릭 싱글톤 코드

using UnityEngine;

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

    // 다른 스크립트에서 싱글톤 인스턴스에 접근할 수 있는 속성
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                // scene에서 찾아보고 없으면 생성
                instance = FindObjectOfType<T>();

                // scene에 없을 경우 새로운 GameObject에 추가하여 생성
                if (instance == null)
                {
                    GameObject singletonObject = new GameObject(typeof(T).Name);
                    instance = singletonObject.AddComponent<T>();
                }
            }

            return instance;
        }
    }

    // Awake 함수에서 중복된 인스턴스를 방지
    protected virtual void Awake()
    {
        if (instance == null)
        {
            instance = this as T;
            DontDestroyOnLoad(this.gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
}
profile
유니티 C# 학습자

0개의 댓글