제네릭은 .NET에 형식 매개 변수의 개념을 소개합니다. 제네릭을 사용하면 코드에서 클래스 또는 메서드를 사용할 때까지 하나 이상의 형식 매개 변수 사양을 연기하는 클래스와 메서드를 디자인할 수 있습니다. 예를 들어 제네릭 형식 매개 변수 T
를 사용하여 다음과 같이 런타임 캐스트 또는 boxing 작업의 비용 또는 위험을 초래하지 않고 다른 클라이언트 코드에서 사용할 수 있는 단일 클래스를 작성할 수 있습니다.
// Declare the generic class.
public class GenericList<T>
{
public void Add(T item) { }
}
public class ExampleClass { }
class TestGenericList
{
static void Main()
{
// Create a list of type int.
GenericList<int> list1 = new();
list1.Add(1);
// Create a list of type string.
GenericList<string> list2 = new();
list2.Add("");
// Create a list of type ExampleClass.
GenericList<ExampleClass> list3 = new();
list3.Add(new ExampleClass());
}
}
제네릭 클래스와 메서드는 재사용성, 형식 안전성 및 효율성을 제네릭이 아닌 클래스에서 사용할 수 없는 방식으로 결합합니다. 제네릭 형식 매개 변수는 컴파일 중에 형식 인수로 대체됩니다. 앞의 예제에서 컴파일러는 T
를 int
로 바꿉니다. 제네릭은 컬렉션 및 컬렉션에서 작동하는 메서드와 함께 가장 자주 사용됩니다. 네임스페이 System.Collections.Generic 스에는 여러 제네릭 기반 컬렉션 클래스가 포함되어 있습니다. 이러한 비제네릭 컬렉션 ArrayList 은 권장되지 않으며 호환성을 위해서만 유지 관리됩니다. 자세한 내용은 .NET
사용자 지정 제네릭 형식 및 메서드를 만들어 형식이 안전하고 효율적인 사용자 고유의 일반화된 솔루션과 디자인 패턴을 제공할 수도 있습니다. 다음 코드 예제에서는 데모용으로 간단한 제네릭 linked-list 클래스를 보여 있습니다. (대부분의 경우 직접 만드는 대신 .NET에서 제공하는 클래스를 사용해야 List<T> 합니다.) 형식 매개 변수 T
는 구체적인 형식이 일반적으로 목록에 저장된 항목의 형식을 나타내는 데 사용되는 여러 위치에서 사용됩니다.
-
AddHead
메서드의 매개 변수 형식으로서. - 중첩
Data
클래스의Node
속성에 대한 반환 형식입니다. - 중첩 클래스의 프라이빗 멤버
data
형식입니다.
T
는 중첩된 Node
클래스에서 사용할 수 있습니다.
GenericList<T>
은 구체적인 형식으로 GenericList<int>
로 인스턴스화되면, 각 T
가 int
로 바뀝니다.
// Type parameter T in angle brackets.
public class GenericList<T>
{
// The nested class is also generic, and
// holds a data item of type T.
private class Node(T t)
{
// T as property type.
public T Data { get; set; } = t;
public Node? Next { get; set; }
}
// First item in the linked list
private Node? head;
// T as parameter type.
public void AddHead(T t)
{
Node n = new(t);
n.Next = head;
head = n;
}
// T in method return type.
public IEnumerator<T> GetEnumerator()
{
Node? current = head;
while (current is not null)
{
yield return current.Data;
current = current.Next;
}
}
}
다음 코드 예제에서는 클라이언트 코드에서 제네릭 GenericList<T>
클래스를 사용하여 정수 목록을 만드는 방법을 보여 줍니다. 형식 인수를 변경하는 경우 다음 코드는 문자열 목록 또는 다른 사용자 지정 형식을 만듭니다.
// A generic list of int.
GenericList<int> list = new();
// Add ten int values.
for (int x = 0; x < 10; x++)
{
list.AddHead(x);
}
// Write them to the console.
foreach (int i in list)
{
Console.WriteLine(i);
}
Console.WriteLine("Done");
비고
제네릭 형식은 클래스로 제한되지 않습니다. 앞의 예제에서는 class
형식을 사용합니다. 하지만 interface
형식을 포함하여 제네릭 struct
및 record
형식을 정의할 수 있습니다.
제네릭 개요
- 제네릭 형식을 사용하여 코드 재사용, 형식 안전성 및 성능을 최대화합니다.
- 제네릭의 가장 일반적인 용도는 컬렉션 클래스를 만드는 것입니다.
- .NET 클래스 라이브러리에는 네임스페이스의 여러 제네릭 컬렉션 클래스가 System.Collections.Generic 포함되어 있습니다. 제네릭 컬렉션은 네임스페이스 같은 ArrayListSystem.Collections 클래스 대신 가능하면 언제든지 사용해야 합니다.
- 고유한 제네릭 인터페이스, 클래스, 메서드, 이벤트 및 대리자를 만들 수 있습니다.
- 제네릭 클래스는 특정 데이터 형식의 메서드에 액세스할 수 있도록 제한될 수 있습니다.
- 리플렉션을 사용하여 제네릭 데이터 형식에 사용되는 형식에 대한 정보를 런타임에 가져올 수 있습니다.
C# 언어 사양
자세한 내용은 C# 언어 사양을 참조하세요.
참고하십시오
.NET