Share via


제네릭의 장점 및 제한 사항

제네릭 기능을 사용하면 제네릭 클래스나 메서드에 의해 사용되는 특정 형식을 지정할 수 있으므로 형식 안전성에 대한 작업을 컴파일러에서 담당하게 됩니다. 컴파일 타임에 형식 안전성이 적용되므로 올바른 데이터 형식을 테스트하기 위해 코드를 작성할 필요가 없습니다. 형식 캐스팅의 필요성과 런타임 오류의 가능성이 줄어듭니다.

제네릭은 여러 구현의 오버헤드 없이 형식 안전성을 제공합니다. 예를 들어, 다음 변수 선언과 함께 연결된 문자열 목록을 만들 수 있습니다.

Dim llist As New LinkedList(Of String)()
LinkedList<string> llist = new LinkedList<string>();
LinkedList<String^>^ llist = gcnew LinkedList<String^>();

기본 형식에서 상속하고 멤버를 재정의하지 않아도 됩니다. 연결된 목록은 바로 사용할 수 있습니다. .NET Framework에서 제공하는 제네릭 컬렉션 형식은 System.Collections.GenericSystem.Collections.ObjectModel을 참조하십시오.

형식 안전성 외에, 일반적으로 제네릭 컬렉션 형식은 값 형식을 boxing하지 않아도 되므로 값 형식을 효율적으로 저장하고 조작할 수 있습니다.

제네릭 대리자를 사용하면 여러 대리자 클래스를 만들 필요 없이 형식이 안전한 콜백을 사용할 수 있습니다. 예를 들어, Predicate<T> 제네릭 대리자를 사용하면 특정 형식에 대한 사용자 고유의 검색 조건을 구현하는 메서드를 만들고, 해당 메서드를 Find<T>, FindLast<T>FindAll<T>과 같은 Array 형식의 메서드와 함께 사용할 수 있습니다.

또한 제네릭 대리자는 대리자 형식을 생성할 필요 없이 동적으로 생성된 코드에서 사용할 수도 있습니다. 이렇게 하면 전체 어셈블리를 생성하는 대신 간단한 동적 메서드를 사용할 수 있는 시나리오 수가 증가합니다. 자세한 내용은 방법: 동적 메서드 정의 및 실행DynamicMethod를 참조하십시오.

대부분의 경우 Visual Basic, Visual C++ 및 C# 컴파일러는 제네릭 메서드 호출에 의해 사용되는 형식을 컨텍스트에서 결정하여 제네릭 메서드 사용을 위해 구문을 크게 단순화할 수 있습니다. 예를 들어, 다음 코드에서는 문자열 배열을 검색하기 위해 BinarySearch 제네릭 메서드를 호출하는 약식 및 긴 형식을 보여 줍니다. 짧은 형식에서 컴파일러는 메서드 인수의 형식에서 올바른 형식 매개 변수를 유추합니다.

Dim index0 As Integer = Array.BinarySearch(myArray, "test string")
Dim index1 As Integer = Array.BinarySearch(Of String)(myArray, "test string")
int index0 = Array.BinarySearch(myArray, "test string");
int index1 = Array.BinarySearch<string>(myArray, "test string");
int index0 = Array::BinarySearch(myArray, "test string");
int index1 = Array::BinarySearch<String^>(myArray, "test string");

제네릭의 제한 사항

다음은 .NET Framework 버전 2.0의 제네릭에 적용되는 몇 가지 제한 사항입니다.

  • 제네릭 형식은 MarshalByRefObject와 같은 대부분의 기본 클래스에서 파생될 수 있으며, MarshalByRefObject와 같은 기본 클래스에서 제네릭 형식 매개 변수를 파생하도록 제약 조건을 사용할 수 있습니다. 그러나 이 .NET Framework 릴리스에서는 컨텍스트 바인딩된 제네릭 형식이 지원되지 않습니다. 제네릭 형식이 ContextBoundObject에서 파생될 수 있지만 해당 형식의 인스턴스를 만들려고 시도하면 TypeLoadException이 발생합니다.

  • 열거할 때 제네릭 형식 매개 변수를 사용할 수 없습니다. 예를 들어, 열거형은 Visual Basic, C# 또는 C++를 사용하여 정의된 제네릭 형식에 중첩되므로 부수적으로만 제네릭이 될 수 있습니다. 자세한 내용은 공용 형식 시스템의 "열거형"을 참조하십시오.

  • 간단한 동적 메서드는 제네릭이 될 수 없습니다. 동적 메서드에 대한 자세한 내용은 리플렉션 내보내기 동적 메서드 시나리오를 참조하십시오.

  • Visual Basic, C# 및 C++에서 제네릭 형식에 포함된 중첩 형식은 모든 바깥쪽 형식의 형식 매개 변수에 형식이 할당될 때까지는 인스턴스화될 수 없습니다. 리플렉션에서 이러한 언어를 사용하여 정의된 중첩 형식은 모든 바깥쪽 형식의 형식 매개 변수를 포함합니다. 따라서 바깥쪽 형식의 형식 매개 변수를 중첩 형식의 멤버 정의에 사용할 수 있습니다. 자세한 내용은 MakeGenericType의 "중첩 형식"을 참조하십시오.

    참고참고

    동적 어셈블리에서 코드를 생성하여 정의되거나 Ilasm.exe(MSIL 어셈블러)를 사용하여 정의되는 중첩 형식은 해당 바깥쪽 형식의 형식 매개 변수를 포함할 필요가 없지만, 그럴 경우 형식 매개 변수가 중첩 클래스의 범위에 포함되지 않습니다.

    자세한 내용은 MakeGenericType의 "중첩 형식"을 참조하십시오.

참고 항목

참조

System.Collections.Generic

System.Collections.ObjectModel

개념

.NET Framework의 제네릭

.NET Framework의 제네릭 컬렉션

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

제네릭 인터페이스