제네릭 클래스나 메소드에서 T는 모든 데이터형식을 대신 할 수 있다.
그런데 종족 특정 조건에 해당하는 데이터형식만 받고 싶을 때가 있다.
이럴때는 형식에 제약 조건을 줄 수 있다.
where 형식 변수 : 제약조건
제약조건 class
class ArrayGeneric<T> where T : class
{
private T[] arr;
public T GetElement(int index) {return arr[index];}
}
T는 참조 형식이어야 한다.
위의 예제에서 T에 int나 float과 같은 값 형식은 들어올 수 없다.
따라서,
ArrayGeneric<int> arr = new ArrayGeneric<int>()
와 같은 코드는 컴파일에러가 발생한다.
제약조건 struct
class ArrayGeneric<T> where T : struct
{
private T[] arr;
public T GetElement(int index) {return arr[index];}
}
제약조건을 값 형식으로 주려면 struct를 사용한다.
float, int와 같은 데이터 형식을 사용할 수 있다.
제약조건 new()
public static T CraeteInstance<T>() where T : new()
{
return new T();
}
new()는 매개변수를 받지않는 생성자가 있어야한다는 조건이다.
다음 예시를 보자.
class Test1
{
int value;
public Test1()
{
value = 5;
}
}
class Test2
{
int value;
public Test2(int value)
{
this.value = value;
}
}
Test1은 생성자에 매개변수가 없고, Test2는 생성자에 매개변수가 있다.
static void Main()
{
Test1 t1 = CraeteInstance<Test1>();
Test2 t2 = CraeteInstance<Test2>(); // Compile Error!
}
CreateInstance<T>
에서 T가 new()로 한정되어있기 때문에 Test2는 해당되지 않는다.
기타
class, struct, new 외에도 클래스나 인터페이스의 상속을 제약 조건으로 할 수 있다.
참조
뇌를 자극하는 C# 5.0 프로그래밍, 박상현, 한빛미디어
'아카이빙 > C#' 카테고리의 다른 글
[C#] Delegate (대리자) (0) | 2018.06.25 |
---|---|
[C#] 예외처리 (0) | 2018.06.21 |
[C#] 제네릭 클래스 (0) | 2018.06.21 |
[C#] 제네릭 메소드 (0) | 2018.06.21 |
[C#] foreach 가능한 객체 만들기 (0) | 2018.06.20 |