아카이빙/C#

[C#] 제네릭의 형식 제약

셩님 2018. 6. 21. 08:10

[C#] 제네릭의 형식 제약

  • 제네릭 클래스나 메소드에서 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