// 함수
static void Swap<T>(ref T left, ref T right)
{
T temp = left;
left = right;
right = temp;
}
// 호출
int a = 1;
int b = 2;
Swap(ref a, ref b); // <T> 생략가능
T는 타입 매개변수(Type Parameter)로, 컴파일 시 실제 타입으로 대체된다.
박싱, 언박싱을 거치지 않고 형식을 조정할 수 있어 성능이 향상된다.
object 형식을 사용할 때보다 간결하고, 직관적인 코드 작성이 가능하다.
오버로딩과 달리, 제네릭은 하나의 함수만으로 여러 타입에 대해 재사용이 가능하다.
Generic 함수는 연산자 지원 타입인지 알 수 없으므로 연산을 허용하지 않는다.
public static void GenericTest<T1, T2>(T1 value1, T2 value2)
where T1 : class // 참조 타입만 허용
where T2 : struct // 값 타입만 허용
{
// T1은 class 상속받은 타입만 가능
// T2는 struct 상속받은 타입만 가능
}
where 키워드를 사용하면, Generic 타입의 멤버(함수, 프로퍼티 등)에 안전하게 접근할 수 있다.
형식 안정성과 가독성을 높이고, 불필요한 형변환이나 예외를 방지할 수 있다
여러개의 제약 조건을 동시에 걸 수 있다 ex) class + new() 등