클래스에서 미리 타입을 지정해 놓는 것이 아닌, 사용자가 지정한 타입을 사용하도록 하게 해주는 타입을 일반화 시킨 것을 의미한다.
사용자가 타입을 지정해서 사용할 수 있기 때문에 확장성이 좋고, 여러 상황에 대하여 기능을 만들 수 있다.
Generic으로 받는 타입에 주는 제약으로, 제약 조건을 만족하는 타입만 받도록 해준다.
Generic을 사용하다 보면, Generic으로 받은 Type에 대한 객체를 생성해 주어야 하는 경우가 생긴다. 하지만, 일반적으로는 제네릭에 대해서 생성자를 사용하지 못한다. 이 때 new() 제약으로, 타입에 생성자가 있는 타입을 받아오게 함으로, 받아온 모든 타입에 new()를 사용할 수 있다는 것을 알 수 있다.
private void TestGeneric<T>() where T : UnityEngine.Component, new()
{
}
//제약 조건을 여러개를 입력하기 위해서는 조건마다 ','로 구분해 준다.
//타입에 new()라는 제약을 두었기에, 타입에 매개변수 없는 생성자가 존재해야 한다.
private void Start()
{
TestGeneric<int>();
TestGeneric<string>();
TestGeneric<Vector3>();
}
private void TestGeneric<T>()
{
List<T> genericList = new List<T>();
Debug.Log(genericList.GetType());
}
//실행 결과 :
// System.Collections.Generic.List`1[System.Int32]
// System.Collections.Generic.List`1[System.String]
// System.Collections.Generic.List`1[UnityEngine.Vector3]
private void Start()
{
TestGeneric<int>();
TestGeneric<string>();
TestGeneric<Vector3>();
}
private void TestGeneric<T>() where T : UnityEngine.Component
{
}
//Start에서 호출해 주려는 TestGeneric<T>()은 int, string, Vector3로 유니티엔진의 컴포넌트가 아니기에, 오류가 발생한다.