제네릭 소개(C# 프로그래밍 가이드)
제네릭 클래스 및 메서드를 사용하면 제네릭이 아닌 형식에서는 불가능한 방식으로 재사용성, 형식 안전성 및 효율성을 동시에 달성할 수 있습니다.제네릭은 컬렉션 및 컬렉션을 다루는 메서드에서 가장 자주 사용됩니다..NET Framework 클래스 라이브러리 버전 2.0에서는 System.Collections.Generic이라는 새로운 네임스페이스를 제공하며, 이 네임스페이스에는 새로운 제네릭 기반 컬렉션 클래스가 여러 개 있습니다..NET Framework 2.0 이상을 대상으로 하는 모든 응용 프로그램에서는 이전의 ArrayList 같은 제네릭이 아닌 형식 대신 새로운 제네릭 컬렉션 클래스를 사용하는 것이 좋습니다.자세한 내용은 .NET Framework 클래스 라이브러리의 제네릭(C# 프로그래밍 가이드)를 참조하십시오.
물론 사용자 고유의 형식이 안전하고 효율적인 일반화 솔루션 및 디자인 패턴을 제공하기 위해 사용자 지정 제네릭 형식 및 메서드를 만들 수도 있습니다.다음 코드 예제에서는 이해를 돕기 위해 간단한 제네릭 연결 리스트 클래스를 보여 줍니다.대부분의 경우에는 사용자가 이러한 클래스를 직접 만드는 대신 .NET Framework 클래스 라이브러리에서 제공하는 List<T> 클래스를 사용해야 합니다. 목록에 저장되는 항목의 형식을 지정하기 위해 일반적으로는 구체적인 형식이 사용될 여러 위치에 형식 매개 변수 T가 사용되고 있습니다.구체적으로는 다음과 같이 사용되고 있습니다.
AddHead 메서드의 메서드 매개 변수 형식
공용 메서드인 GetNext의 반환 형식 및 중첩 Node 클래스의 Data 속성
중첩 클래스에 있는 전용 멤버 데이터의 형식
중첩 Node 클래스에서도 T를 사용할 수 있습니다.GenericList<int>와 같이 GenericList<T>를 구체적 형식을 사용하여 인스턴스화하면 모든 T가 int로 대체됩니다.
// type parameter T in angle brackets
public class GenericList<T>
{
// The nested class is also generic on T.
private class Node
{
// T used in non-generic constructor.
public Node(T t)
{
next = null;
data = t;
}
private Node next;
public Node Next
{
get { return next; }
set { next = value; }
}
// T as private member data type.
private T data;
// T as return type of property.
public T Data
{
get { return data; }
set { data = value; }
}
}
private Node head;
// constructor
public GenericList()
{
head = null;
}
// T as method parameter type:
public void AddHead(T t)
{
Node n = new Node(t);
n.Next = head;
head = n;
}
public IEnumerator<T> GetEnumerator()
{
Node current = head;
while (current != null)
{
yield return current.Data;
current = current.Next;
}
}
}
다음 코드 예제에서는 클라이언트 코드에서 제네릭 GenericList<T> 클래스를 사용하여 정수 목록을 만드는 방법을 보여 줍니다.형식 매개 변수를 변경하는 간단한 방법으로 다음 코드를 문자열이나 기타 사용자 지정 형식의 목록을 만들도록 쉽게 변경할 수 있습니다.
class TestGenericList
{
static void Main()
{
// int is the type argument
GenericList<int> list = new GenericList<int>();
for (int x = 0; x < 10; x++)
{
list.AddHead(x);
}
foreach (int i in list)
{
System.Console.Write(i + " ");
}
System.Console.WriteLine("\nDone");
}
}