.NET Framework의 제네릭

제네릭을 사용하면 메서드, 클래스, 구조 또는 인터페이스를 작동하는 정확한 데이터 형식에 맞게 조정할 수 있습니다. 예를 들어, 키와 값을 임의의 형식으로 지정하는 Hashtable 클래스를 사용하는 대신 Dictionary<TKey, TValue> 제네릭 클래스를 사용하여 키에 허용되는 형식과 값에 허용되는 형식을 지정할 수 있습니다. 제네릭의 이점 중에는 향상된 코드 재사용성과 형식 안전성이 있습니다.

이 항목에서는 .NET Framework의 제네릭에 대한 개요를 제공하고 제네릭 형식 또는 메서드에 대해 간략하게 설명합니다. 여기에는 다음 단원이 포함되어 있습니다.

  • 제네릭 정의 및 사용

  • 제네릭 관련 용어

  • 클래스 라이브러리 및 언어 지원

  • 중첩 형식 및 제네릭

  • 관련 항목

  • 참조

제네릭 정의 및 사용

제네릭이란 저장하거나 사용하는 하나 이상의 형식에 대한 자리 표시자(형식 매개 변수)가 있는 클래스, 구조체, 인터페이스 및 메서드입니다. 제네릭 컬렉션 클래스는 저장하는 개체 형식에 대한 자리 표시자로 형식 매개 변수를 사용할 수 있고 형식 매개 변수는 해당 필드의 형식과 해당 메서드의 매개 변수 형식으로 나타납니다. 제네릭 메서드는 해당 형식 매개 변수를 반환 값의 형식 또는 해당 정식 매개 변수 중 하나의 형식으로 사용할 수 있습니다. 다음 코드에서는 간단한 제네릭 클래스 정의를 보여 줍니다.

Public Class Generic(Of T)
    Public Field As T

End Class
public class Generic<T>
{
    public T Field;
}
generic<typename T>
public ref class Generics
{
public:
    T Field;
};

제네릭 클래스의 인스턴스를 만들 때 형식 매개 변수를 대체할 실제 형식을 지정하게 됩니다. 이렇게 하면 생성된 제네릭 클래스라는 새 제네릭 클래스가 설정되고, 선택한 형식이 형식 매개 변수가 표시되는 모든 곳에서 대체됩니다. 그 결과로 다음 코드에서와 같이 사용자가 선택한 형식에 맞게 작성된 형식이 안전한 클래스가 됩니다.

Public Shared Sub Main()
    Dim g As New Generic(Of String)
    g.Field = "A string"
    '...
    Console.WriteLine("Generic.Field           = ""{0}""", g.Field)
    Console.WriteLine("Generic.Field.GetType() = {0}", g.Field.GetType().FullName)
End Sub
public static void Main()
{
    Generic<string> g = new Generic<string>();
    g.Field = "A string";
    //...
    Console.WriteLine("Generic.Field           = \"{0}\"", g.Field);
    Console.WriteLine("Generic.Field.GetType() = {0}", g.Field.GetType().FullName);
}
static void Main()
{
    Generics<String^>^ g = gcnew Generics<String^>();
    g->Field = "A string";
    //...
    Console::WriteLine("Generics.Field           = \"{0}\"", g->Field);
    Console::WriteLine("Generics.Field.GetType() = {0}", g->Field->GetType()->FullName);
}

맨 위로 이동

제네릭 관련 용어

다음은 .NET Framework의 제네릭과 관련하여 사용되는 용어입니다.

  • 제네릭 형식 정의는 포함하거나 사용할 수 있는 형식에 대한 자리 표시자와 함께 템플릿으로 사용되는 클래스, 구조체 또는 인터페이스 선언입니다. 예를 들어, System.Collections.Generic.Dictionary<TKey, TValue> 클래스에는 키와 값이라는 두 가지 형식이 포함될 수 있습니다. 제네릭 형식 정의는 템플릿에 불과하기 때문에 제네릭 형식 정의인 클래스, 구조체 또는 인터페이스의 인스턴스를 만들 수 없습니다.

  • 제네릭 형식 매개 변수 또는 형식 매개 변수는 제네릭 형식 또는 메서드 정의의 자리 표시자입니다. System.Collections.Generic.Dictionary<TKey, TValue> 제네릭 형식에는 해당 키와 값의 형식을 나타내는 TKey 및 TValue의 두 가지 형식 매개 변수가 있습니다.

  • 생성된 제네릭 형식 또는 생성된 형식은 제네릭 형식 정의의 제네릭 형식 매개 변수에 대해 형식을 지정한 결과입니다.

  • 제네릭 형식 인수는 제네릭 형식 매개 변수를 대체하는 임의의 형식입니다.

  • 제네릭 형식이라는 일반 용어에는 생성된 형식과 제네릭 형식 정의가 모두 포함됩니다.

  • 제네릭 형식 매개 변수의 공 분산 및 반공변성(Contravariance)을 사용하면 형식 인수가 생성된 대상 형식보다 더 많이 파생되었거나(공 분산) 더 적게 파생된(반공변성(Contravariance)) 생성된 제네릭 형식을 사용할 수 있습니다. 공 분산과 반공변성(Contravariance)은 통칭하여 가변성(variance)이라고 합니다. 자세한 내용은 제네릭의 공변성(Covariance)과 반공변성(Contravariance)을 참조하십시오.

  • 제약 조건은 제네릭 형식 매개 변수에 대한 제한 사항입니다. 예를 들어, 형식 매개 변수를 System.Collections.Generic.IComparer<T> 제네릭 인터페이스를 구현하는 형식으로 제한하여 해당 형식의 인스턴스에 대한 순서를 매기도록 할 수 있습니다. 또한 형식 매개 변수를 특정 기준 클래스가 있는 형식, 기본 생성자가 있는 형식 또는 참조 형식이나 값 형식인 형식으로 제한할 수도 있습니다. 제네릭 형식의 사용자는 제약 조건을 충족하지 않는 형식 인수를 대체할 수 없습니다.

  • 제네릭 메서드 정의는 제네릭 형식 매개 변수 목록과 정식 매개 변수 목록의 두 매개 변수 목록을 가진 메서드입니다. 형식 매개 변수는 다음 코드에서와 같이 반환 형식 또는 정식 매개 변수의 형식으로 나타날 수 있습니다.

Function Generic(Of T)(ByVal arg As T) As T
    Dim temp As T = arg
    '...
    Return temp
End Function
T Generic<T>(T arg)
{
    T temp = arg;
    //...
    return temp;
}
generic<typename T>
T Generic(T arg)
{
    T temp = arg;
    //...
    return temp;
}

제네릭 메서드는 제네릭 형식 또는 제네릭이 아닌 형식에 나타날 수 있습니다. 메서드는 제네릭 형식에 속하기 때문에 또는 해당 형식이 바깥쪽 형식의 제네릭 매개 변수인 정식 매개 변수를 가지고 있기 때문에 제네릭이 아닙니다. 메서드는 고유한 형식 매개 변수 목록을 가지고 있는 경우에만 제네릭입니다. 다음 코드에서는 G 메서드만 제네릭입니다.

Class A
    Function G(Of T)(ByVal arg As T) As T
        Dim temp As T = arg
        '...
        Return temp
    End Function
End Class
Class Generic(Of T)
    Function M(ByVal arg As T) As T
        Dim temp As T = arg
        '...
        Return temp
    End Function
End Class
class A
{
    T G<T>(T arg)
    {
        T temp = arg;
        //...
        return temp;
    }
}
class Generic<T>
{
    T M(T arg)
    {
        T temp = arg;
        //...
        return temp;
    }
}
ref class A
{
    generic<typename T>
    T G(T arg)
    {
        T temp = arg;
        //...
        return temp;
    }
};
generic<typename T>
ref class Generic
{
    T M(T arg)
    {
        T temp = arg;
        //...
        return temp;
    }
};

맨 위로 이동

클래스 라이브러리 및 언어 지원

.NET Framework에서는 다음 네임스페이스를 통해 많은 제네릭 컬렉션 클래스를 제공합니다.

정렬과 같음 비교를 구현하는 제네릭 인터페이스는 이벤트 처리기, 변환 및 검색 조건자의 제네릭 대리자 형식과 함께 System 네임스페이스에 제공됩니다.

제네릭에 대한 지원이 제네릭 형식과 제네릭 메서드를 검사하는 System.Reflection 네임스페이스, 제네릭 형식과 메서드가 포함된 동적 어셈블리를 내보내는 System.Reflection.Emit 및 제네릭이 포함된 소스 그래프를 생성하는 System.CodeDom에 추가되었습니다.

공용 언어 런타임에서는 MSIL(Microsoft Intermediate Language)에서 Stelem, Ldelem, Unbox_Any, Constrained, Readonly 등의 제네릭 형식을 지원할 수 있도록 새 opcode와 접두사를 제공합니다.

Visual C++, C# 및 Visual Basic에서는 모두 제네릭을 정의하고 사용하기 위한 모든 지원을 제공합니다. 언어 지원에 대한 자세한 내용은 Visual Basic의 제네릭 형식(Visual Basic), 제네릭 소개(C# 프로그래밍 가이드)Overview of Generics in Visual C++를 참조하십시오.

맨 위로 이동

중첩 형식 및 제네릭

제네릭 형식에 중첩되는 형식은 바깥쪽 제네릭 형식의 형식 매개 변수에 따라 달라질 수 있습니다. 공용 언어 런타임은 중첩 형식에 고유한 제네릭 형식 매개 변수가 없는 경우에도 중첩 형식을 제네릭으로 간주합니다. 중첩 형식의 인스턴스를 만들 때 모든 바깥쪽 제네릭 형식에 대해 형식 인수를 지정해야 합니다.

맨 위로 이동

관련 항목

제목

설명

.NET Framework의 제네릭 컬렉션

.NET Framework의 제네릭 컬렉션 클래스 및 다른 제네릭 형식에 대해 설명합니다.

배열과 목록을 조작하기 위한 제네릭 대리자

배열 또는 컬렉션의 요소에서 사용될 변환, 검색 조건자 및 작업에 대한 제네릭 대리자에 대해 설명합니다.

제네릭 인터페이스

제네릭 형식 패밀리에서 공통 기능을 제공하는 제네릭 인터페이스에 대해 설명합니다.

제네릭의 공변성(Covariance)과 반공변성(Contravariance)

제네릭 형식 매개 변수의 공 분산 및 반공변성(Contravariance)에 대해 설명합니다.

제네릭의 장점 및 제한 사항

제네릭 사용에 따르는 이점 및 제한 사항을 요약하여 설명합니다.

일반적으로 사용되는 컬렉션 형식

제네릭 형식을 비롯하여 .NET Framework의 컬렉션 형식에 대한 특징과 사용 시나리오를 요약하여 설명합니다.

제네릭 컬렉션 사용 기준

제네릭 컬렉션 형식의 사용 시기를 결정하는 일반 규칙에 대해 설명합니다.

방법: 리플렉션 내보내기를 사용하여 제네릭 형식 정의

제네릭 형식과 메서드가 포함된 동적 어셈블리를 생성하는 방법에 대해 설명합니다.

Visual Basic의 제네릭 형식(Visual Basic)

제네릭 형식을 사용하고 정의하는 데 대한 방법 항목을 포함하여 Visual Basic 사용자의 제네릭 기능에 대해 설명합니다.

제네릭 소개(C# 프로그래밍 가이드)

C# 사용자의 제네릭 형식을 정의하고 사용하는 방법을 간략하게 설명합니다.

Overview of Generics in Visual C++

제네릭과 템플릿 간의 차이를 포함하여 C++ 사용자의 제네릭 기능에 대해 설명합니다.

맨 위로 이동

참조

System.Collections.Generic

System.Collections.ObjectModel

System.Reflection.Emit.OpCodes

맨 위로 이동