본문 바로가기
프로그래밍/C#

C# where 제네릭 형식 제약(generic type constraint)

by bantomak 2023. 6. 28.

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# 프로그래밍 가이드

형식 매개 변수에 대한 제약 조건을 알아봅니다. 제약 조건은 형식 인수에 포함되어야 하는 기능을 컴파일러에 알립니다.

learn.microsoft.com

댓글