반응형
제네릭(Generic)은 특정 데이터 타입에 국한되지 않고 모든 타입을 허용하는 타입이지만, 특정 조건에만 대응되는 데이터 타입이 필요한 경우 where 키워드를 사용하여 제약 조건을 추가할 수 있으며 제약조건을 만족하지 않는 경우 컴파일에러가 발생하도록 할 수 있다.
모든 타입을 허용하는 제네릭 클래스
class GenericClass <T>
{
public T member {get; set;}
}
class Program
{
static void Main(string[] arg)
{
GenericClass<int> genericObj1 = new GenericClass<int>();
GenericClass<string> genericObj2 = new GenericClass<string>();
GenericClass<ArrayList> genericObj3 = new GenericClass<ArrayList>();
}
}
제네릭 제약 조건 종류
제약 조건 | 설명 |
where T : struct | T는 null을 허용하지 않는 값 형식 이어야 함 |
where T : class | T는 참조 형식 이어야 함 |
where T : new() | T는 매개변수가 없는 public 생성자가 있어야함. 다른 제약 조건과 함께 사용되는경우 new() 제약 조건을 마지막에 지정해 주어야 함 |
where T : not null | T는 null이 아닌 형식이어야 함 |
where T : unmanaged | T는 null이 아닌 비관리형 형식이어야 합니다. |
where T : <base class name> | T는 지정된기본 클래스이거나 이 클래스에서 파생된 클래스여야 합니다. |
where T : <interface name> | T는 지정된 기본 인터페이스 이거나 이 인터페이스에서 파생된 유형이여야 합니다. |
where T : U | U는인터페이스, 추상클래스 또는 일반 클래스가 될수 있으며, T는 U에 상속되어야 합니다. |
struct 제약 조건
class GenericClass <T> where T : struct
{
public T member { get; set; }
}
class Program
{
static void Main(string[] args)
{
GenericClass<int> genericObj1 = new GenericClass<int>();
GenericClass<string> genericObj2 = new GenericClass<string>(); //참조형식 => 오류
GenericClass<ArrayList> genericObj3 = new GenericClass<ArrayList>(); //참조형식 => 오류
}
}
new 제약 조건
class GenericClass <T> where T : new()
{
public T member { get; set; }
}
class Program
{
static void Main(string[] args)
{
GenericClass<int> genericObj1 = new GenericClass<int>();
// 매개변수를 필요로하는 생성자만 있으므로 오류
GenericClass<string> genericObj2 = new GenericClass<string>();
GenericClass<ArrayList> genericObj3 = new GenericClass<ArrayList>();
}
}
not null 제약 조건
null이 아닌 값 형식 또는 참조 형식의 타입을 지정해야하며 다른 제약 조건과 다르게 제약 조건을 위반하면, 경고를 발생한다.
unmanaged 제약 조건
관리가 되지 않는 타입들을 허용하는 제약조건
비관리형 타입
- sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool
- 열거형
- 포인터
멀티 제약 조건
제네릭 클래스에 제네릭 유형이 2개 이상이며, 제네릭 유형마다 제약 조건이 존재하는 경우
public class GenericClass<T, X> where T : struct where X : class
{
}
제네릭 유형 T는 struct 제약 조건을 추가 하였고 X는 class 제약 조건을 추가함
출처: https://developer-talk.tistory.com/209 [평범한 직장인의 공부 정리:티스토리]https://developer-talk.tistory.com/209
반응형
'C#' 카테고리의 다른 글
[C#] Closure(클로저) 이해하기 (0) | 2023.05.02 |
---|---|
[C#] Action, Predicate, Function (0) | 2022.11.15 |
[c#] delegate 와 Event (0) | 2022.06.30 |
[c#] 추상클래스와 추상 메서드(abstract) (0) | 2021.08.20 |
[c#] 가상(virtual)함수와 오버라이딩(override) (0) | 2021.08.20 |