C# Generic
기존 리스트의 박싱, 언박싱의 문제를 해결하기 위해 도입 형태는 다음과 같음.
public class GenericList<T>
{
public void Add(T value)
{
}
public T this[int index]
{
get { throw new NotImplementedException(); }
}
}
** 일반적으로는 직접 만들어서 쓰는경우는 없고 List
제너릭을 사용하면 박싱 언박싱이 필요없어진다.
<> 이걸 사용하며 안쪽에 이름 어떤걸 넣어도 상관없다. 일반적으로 T로 (Type)을 사용한다.
<>안에 넣는걸 형식 매개변수라고 한다. 형식 매개변수는 여러개여도 된다.
public class GenericDictionary<TKey, TValue>
{
public void Add(TKey key, TValue value)
{
}
}
형식 매개 변수에 제약 조건을( T에 대한 조건 where) 사용하려면 다음처럼 한다.
public class GenericList<T> Where T : IComparable
{
}
이 경우는 제너럴 에 넣을수 있는 객체는 IComparable을 구현을 한 객체만 넣을수 있다.
제약 조건은 다음 처럼 사용할수 있다.
where T : struct : T형식 매개변수는 반드시 struct 가능하다.
where T : class : T형식 매개변수는 반드시 class만 가능하다.
where T : new() : T형식 매개변수는 반드시 매개변수가 없는 기본 생성자가 있어야한다.
//Sample
where T : IComparable : T형식 매개변수는 반드시 IComparable를 구현한 것만 가능하다.
where T : Product : T형식 매개변수는 반드시 class product를 상혹받은 클래스만 가능하다.
new()의 예제
public class Utilities<T> where T : IComparable, new()
{
public int Max(int a, int b)
{
return a > b ? a : b;
}
public void DoSomething(T value)
{
var obj = new T();
}
public T Max(T a, T b)
{
return a.CompareTo(b) > 0 ? a : b;
}
}
다시한번 말하지만 ** 일반적으로는 직접 만들어서 쓰는경우는 없고 List