제너릭
제너릭은 특정한 데이터 형식에 종속되지 않고 다양한 데이터 형식에 대해 작동할 수 있는 코드를 작성하는
기술이다. 제너릭은 코드의 재사용성과 유연성을 높여준다.
제너릭 예시 코드
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);
}
}
}