본문 바로가기
C#

[C#] 제네릭 형식 제약조건

by 코모's 2022. 9. 30.
반응형

제네릭(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

반응형