where 제약 조건
C# 제네릭 사용 시에 where 키워드를 사용하여 형식을 제약하는 것이 가능하다.
where T : struct
형식 인수는 null을 허용하지 않는 값 형식이어야 한다. 모든 값 형식에 액세스 할 수 있는 매개 변수가 없는 생성자가 있으므로, struct 제약 조건은 new() 제약 조건을 나타내고 new() 제약 조건과 결합할 수 없다. strcut 제약조건을 unmanaged 제약 조건과 결합할 수 없다.
where T : class
형식 인수는 참조 형식이어야 한다. 이 제약 조건은 모든 클래스, 인터페이스, 대리자 또는 배열 형식에도 적용된다.
where T : class?
형식 인수는 null을 허용하거나 null을 허용하지 않는 참조 형식이어야 한다. 이 제약 조건은 모든 클래스, 인터페이스, 대리자 또는 배열 형식에도 적용된다.
where T : notnull
형식 인수는 nullable이 아닌 형식이어야 한다. 인수는 nullable이 아닌 참조 형식 또는 nullable이 아닌 값 형식일 수 있다.
where T : default
형식 인수는 메서드를 재정의하거나 명시적 인터페이스 구현을 제공할 때 비제한 형식 매개 변수를 지정해야 할 경우 모호성을 해결한다. default 제약 조건은 class 또는 struct 제약 조건이 없는 기본 메서드를 의미한다.
where T : unmanaged
형식 인수는 nullable이 아닌 비관리형 형식이어야 한다. unmanaged 제약 조건은 struct 제약 조건을 나타내며 struct 또는 new() 제약 조건과 결합할 수 없다.
where T : new()
형식 인수에 매개 변수가 없는 public 생성자가 있어야 한다. 다른 제약 조건과 함께 사용할 경우 new() 제약 조건을 마지막에 지정되어야 한다. new() 제약 조건은 struct 또는 unmanaged 제약 조건과 결합할 수 없다.
where 제약 조건을 사용하는 이유
제약 조건은 형식 매개 변수의 기능 및 기대치를 지정한다. 해당 제약 조건을 선언하면 제약 형식의 작업 및 메서드 호출을 사용할 수 있다.
new 제약 조건
new 제약 조건은 제네릭 클래스 또는 메서드 선언의 형식 인수에 매개 변수가 없는 생성자가 있어야 한다고 지정한다.
new 제약 조건을 사용하기 위해 유형을 추상화 할 수 없다.
다음 예제와 같이 제네릭 클래스가 새 인스턴스를 만드는 경우 new 제약 조건을 적용해야 한다.
class ItemFactory<T> where T : new()
{
public T GetNewItem()
{
return new T();
}
}
다른 제약 조건과 함께 new()를 사용해야 하는 경우 반드시 마지막에 지정해야 한다.
public class ItemFactory2<T>
where T : IComparable, new()
{ }
그렇다면 왜 new()를 제약조건으로 설정해야하는가?
>> 제약조건으로 new()가 설정되어 있지 않으면 new T()는 컴파일 에러를 발생한다. T 객체가 T() 생성자를 가지고 있다는 보장이 없기때문이다. 그래서 new T()를 호출하기 위해서는 매개변수가 없는 생성자가 있다는 약속(제약사항)이 반드시 필요하다.
출처
'프로그래밍 > C#' 카테고리의 다른 글
C# virtual 키워드 (24) | 2023.07.05 |
---|---|
C# 식 본문 멤버(Expression-bodied member) (4) | 2023.06.28 |
Queue vs ConcurrentQueue로 쓰레드 환경에서 테스트 (12) | 2023.06.27 |
C# 익명 타입 (Anonymous Type) (10) | 2023.06.19 |
C# List에서 HashSet으로 변환하기 (26) | 2023.06.15 |
댓글