클래스 사용 타입을 클래스를 디자인 할 때 지정하는것이 아니고, 클래스를 사용할 때 지정한 후 사용하는 것을 말한다.
동일한 기능을 하는데, 파라미터의 타입만 다른 함수가 여러개 존재한다면
매개변수를 하나하나 넣어 만들어주기엔 귀찮고 코드가 길어지고 많아진다.
public class Test : MonoBehaviour
{
void Print(int value)
{
print(value);
}
void Print(String value)
{
print(value);
}
void Print(float value)
{
print(value);
}
void Start()
{
Print(3);
Print("삼");
Print(3.5f);
}
}
이와 같이 인터페이스, 메서드를 사용할 때 동일한 기능을 수행하지만, 입력하는 데이터 형식만 다를 경우에 사용하는 것이 제네릭이다.
제네릭 타입에서는 데이터 요소 타입을 확정하지 않고 데이터 타입 자체를 파라미터로 받아들이도록 클래스를 정의한다.
public class Test : MonoBehaviour
{
void Print <T>(T value) //제네릭 타입 사용
{
print(value);
}
void Start()
{
Print<string>("abc");
Print<float>(4.5f);
}
}
> abc
> 4.5
형식 매개 변수로 받을 수 있는 타입을 명시적으로 제한해줄 수 있다
public class Test : MonoBehaviour
{
void Print <T>(T value) where T : struct // struct 타입만 받겠다
{
print(value);
}
void Start()
{
Print<string>("abc"); // string: class 타입
Print<float>(4.5f); // float: struct 타입
}
}
//string 타입은 받을 수 없어서 에러 발생
제네릭 타입을 통한 클래스 선언
public class Abc<T>
{
public T var; // 클래스 선언 시 사용한 타입과 동일.
public T[] array; // 클래스 선언 시 사용한 타입과 동일.
}
public class Test : MonoBehaviour
{
Abc<String> a = new Abc<String>();
Abc<float> b = new Abc<float>();
void Start()
{
a.var = "abc";
b.var = 4.5f;
a.array = new string[1];
b.array = new float[1];
a.array[0] = "abc";
b.array[0] = 4.5f;
print(a.var);
print(a.array[0]);
print(b.var);
print(b.array[0]);
}
}
> abc
> abc
> 4.5
> 4.5