컴퓨터프로그래밍/C#

C# - 제네릭

zelkova 2016. 11. 29. 17:46

<목차로 돌아가기>


제네릭이란 .NET 2.0에서 새롭게 추가된 개념으로 제네릭을 통해서 형식 매개변수(type parameter)라는 개념이 도입되었습니다.  형식 매개변수를 사용해서 클래스나 매서드를 사용하면 그것이 인스턴스화 될때까지 형식지정을 연기할 수 있습니다.


말로 이해하려고 하면 어려우니 아래를 살펴보면 이해가 더 빠를겁니다.


출처 : http://blog.naver.com/thx4alice/110023491588

예제)

  1.  using System;
  2.  using System.Collections.Generic;
  3.  using System.Linq;
  4.  using System.Text;
  5.  using System.Threading.Tasks;

  6.  namespace ConsoleApplication2
  7.  {
  8.     class ARRAY4ALL<T>
  9.     {
  10.         private T[] arr;

  11.         public ARRAY4ALL(int size)
  12.         { arr = new T[size]; }

  13.         public T this[int i]
  14.         {
  15.             get { return arr[i]; }
  16.             set { arr[i] = value; }
  17.         }

  18.         public System.Collections.IEnumerator GetEnumerator()
  19.         {
  20.             for (int i = 0; i < arr.Length; i++)
  21.                 yield return arr[i];
  22.         }
  23.     }

  24.     class Program
  25.     {
  26.         static void Main(string[] args)
  27.         {
  28.             ARRAY4ALL<int> nArr = new ARRAY4ALL<int>(5);
  29.             ARRAY4ALL<double> dArr = new ARRAY4ALL<double>(5);
  30.             ARRAY4ALL<string> strArr = new ARRAY4ALL<string>(5);

  31.             for (int i = 0; i < 5; i++)
  32.             {
  33.                 nArr[i] = i + 1;
  34.                 dArr[i] = i + .1;
  35.                 strArr[i] = "" + Convert.ToChar('A' + i);
  36.             }

  37.             Console.WriteLine("ARRAY4ALL<int> nArr");
  38.             foreach (int o in nArr)
  39.                 Console.WriteLine(o);
  40.             Console.WriteLine("".PadLeft(20, '-'));

  41.             Console.WriteLine("ARRAY4ALL<double> dArr");
  42.             foreach (double o in dArr)
  43.                 Console.WriteLine(o);
  44.             Console.WriteLine("".PadLeft(20, '-'));

  45.             Console.WriteLine("ARRAY4ALL<string> strArr");
  46.             foreach (string o in strArr)
  47.                 Console.WriteLine(o);
  48.             Console.WriteLine("".PadLeft(20, '-'));
  49.         }
  50.     }
  51.  }


결과)


즉, 동일한 기능을 수행하지만 입력받는 타입만 다를 경우 

다른 클래스생성, 다른 메서드를 생성, 메서드 오버로딩, 등을 해야하지만

제네릭을 이용하면 하나만 선언해주고 클라이언트 코드에서 어떤 타입으로 사용할 것인지를 결정해주면 됩니다. 




Fisher Yate 소스

  1. using System.Collections;

  2. public class Utility{
  3. public static T[] SuffleArray<T>(T[] array, int seed)
  4. {
  5. System.Random prng = new System.Random (seed);

  6. for (int i = 0; i < array.Length - 1; i++) 
  7. {
  8. int randomIndex = prng.Next (i, array.Length);
  9. T tempItem = array [randomIndex];
  10. array [randomIndex] = array [i];
  11. array [i] = tempItem;
  12. }

  13. return array;
  14. }
  15. }



반응형

'컴퓨터프로그래밍 > C#' 카테고리의 다른 글

C# - 큐(Queue)  (0) 2016.12.01
C# - 구조체(Structure)  (0) 2016.12.01
C# - 인터페이스  (0) 2016.11.29
C# - 확장클래스, 분할메소드, 중첩클래스  (0) 2016.11.28
C# - 추상클래스  (0) 2016.11.27