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 등을 이용한다. **

teamsmiley's profile image

teamsmiley

2016-12-26 00:00

Read more posts by this author