다음을 통해 공유


.NET Framework의 제네릭 개요

업데이트: 2007년 11월

이 항목에서는 .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 Generic 
{
public:
    T Field;
};

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

Dim g As New Generic(Of String)
g.Field = "A string"
Generic<string> g = new Generic<string>();
g.Field = "A string";
Generic<String^>^ g = gcnew Generic<String^>();
g->Field = "A string";

제네릭 관련 용어

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

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

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

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

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

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

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

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

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

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

    Class A
        Function G(Of T)(ByVal arg As T) As T
            ...
        End Function
    End Class
    Class Generic(Of T)
        Function M(ByVal arg As T) As T
            ...
        End Function
    End Class
    
    class A 
    {
        T G<T>(T arg) {...}
    }
    class Generic<T> 
    {
        T M(T arg) {...}
    }
    
    ref class A 
    {
        generic<T> T G(T arg) {...};
    };
    generic<typename T> ref class Generic 
    {
        T M(T arg) {...};
    };
    

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

중첩 형식 및 제네릭

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

참고 항목

작업

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

개념

제네릭 컬렉션 사용 기준

Visual Basic의 제네릭 형식

Overview of Generics in C++

.NET Framework의 제네릭 컬렉션

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

제네릭 인터페이스

제네릭의 장점 및 제한 사항

참조

System.Collections.Generic

System.Collections.ObjectModel

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

기타 리소스

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

리플렉션 및 제네릭 형식

.NET Framework의 제네릭