7장 - c#2.0 - 제네릭

2014. 12. 25. 23:35IT Books/시작하세요 C# 프로그래밍

<type> 으로 명시하며

지정한 타입은 JIT 컴파일 타임에 기계어 코드를 만들어준다.


제네릭 클래스는

public class GenericClass<T>

와 같은 형식.


제네릭 메서드는

public static void Method1<T> (T item)

{

}

처럼 지정하면 된다.


제네릭은 박싱/언박싱으로 발생하는 힙낭비를 막고 코드 중복도 해결해 준다.



제약 조건



int 타입만 사용하는 이 코드를 제네릭을 적용하여 컴파일하면 어떻게 될까?


이 코드를 빌드하면 CompareTo가 모든 T타입에 의해서 정의되지 않을 수 있으므로 빌드 오류를 발생시킨다.
C++에서 어설프게 템플릿을 사용하는 경우 이런 제약 때문에 빌드가 안되거나 조악한 코드를 넣게 되는데
C#에서는 멋진 해결책이 있다.

바로 'T'에 입력될 수 있는 타입의 조건을 'where' 예약어를 이용해 제한하는 것이다.



이런 식의 제약 조건은

1. class Temp<T> where T : ICollection

2. class Temp<T> where T : ICollection, IConvertivle

3. class Temp<T,V> where T : ICollectio

where V : IComparable


이런 방식으로 지정할 수 있다.


또한 특별한 제약 조건이 있다.

where T : struct    T형식 매개변수는 반드시 값 형식

where T : class    T형식 매개변수는 반드시 참조 형식

where T : new()    T형식 매개변수의 타입에는 반드시 매개변수 없는 기본 생성자가 포함되어 있어야만 한다.

where T : U          T형식 매개변수는 반드시 U형식 인수에 해당하는 타입이거나 그것으로부터 상속받은 클래스만 가능.



--

where T : new() 조건은 T타입의 객체를 제네릭 메서드 / 클래스 내부에서 new 연산자를 통해 생성할 때 사용.



T형식의 item변수가 null이면 무조건 new로 생성하여 리턴하게 되어 있다.
이때 new()제약 조건이 where에 들어가 있지 않으면 오류가 발생하게 된다.
무조건 기본 생성자가 있어야 하기 때문.

Base a = new Derive();

이 코드는 전형적인 다형성을 이용한 인스턴스 생성 방식 예제인데.



이렇게 제약조건을 걸어주면

제네릭으로 처리할 수 있다.

여기서 T는 Base, V는 Derive가 되며,

결과적으로 Derive로 할당하여 Base로 형변환해서 반환하는 역할이다.