제네릭(C# 프로그래밍 가이드)Generics (C# Programming Guide)

제네릭이 C# 언어 및 CLR(공용 언어 런타임)의 버전 2.0에 추가되었습니다.Generics were added to version 2.0 of the C# language and the common language runtime (CLR). 제네릭은 .NET Framework에 클라이언트 코드에서 클래스 또는 메서드를 선언하고 인스턴스화할 때까지 하나 이상의 형식 사양을 따르는 클래스 및 메서드를 디자인할 수 있도록 만드는 형식 매개 변수 개념을 도입합니다.Generics introduce to the .NET Framework the concept of type parameters, which make it possible to design classes and methods that defer the specification of one or more types until the class or method is declared and instantiated by client code. 예를 들어 제네릭 형식 매개 변수 T를 사용하여 여기에 표시된 것처럼, 다른 클라이언트 코드에서 런타임 캐스팅 또는 boxing 작업에 대한 비용이나 위험을 발생하지 않고 사용할 수 있는 단일 클래스를 작성할 수 있습니다.For example, by using a generic type parameter T you can write a single class that other client code can use without incurring the cost or risk of runtime casts or boxing operations, as shown here:

// Declare the generic class.
public class GenericList<T>
{
    public void Add(T input) { }
}
class TestGenericList
{
    private class ExampleClass { }
    static void Main()
    {
        // Declare a list of type int.
        GenericList<int> list1 = new GenericList<int>();
        list1.Add(1);

        // Declare a list of type string.
        GenericList<string> list2 = new GenericList<string>();
        list2.Add("");

        // Declare a list of type ExampleClass.
        GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();
        list3.Add(new ExampleClass());
    }
}

제네릭 클래스 및 메서드는 제네릭이 아닌 클래스 및 메서드에서는 결합할 수 없는 방식으로 재사용성, 형식 안전성 및 효율성을 결합합니다.Generic classes and methods combine reusability, type safety and efficiency in a way that their non-generic counterparts cannot. 제네릭은 컬렉션 및 해당 컬렉션에서 작동하는 메서드에서 가장 자주 사용됩니다.Generics are most frequently used with collections and the methods that operate on them. .NET Framework 클래스 라이브러리 2.0 버전은 여러 가지 새로운 제네릭 기반 컬렉션 클래스가 포함된 새로운 네임스페이스 System.Collections.Generic을 제공합니다.Version 2.0 of the .NET Framework class library provides a new namespace, System.Collections.Generic, which contains several new generic-based collection classes. .NET Framework 2.0 이상을 대상으로 하는 모든 애플리케이션은 ArrayList 같은 이전의 제네릭이 아닌 컬렉션 클래스 대신 새로운 제네릭 컬렉션 클래스를 사용하는 것이 좋습니다.It is recommended that all applications that target the .NET Framework 2.0 and later use the new generic collection classes instead of the older non-generic counterparts such as ArrayList. 자세한 내용은 .NET의 제네릭을 참조하세요.For more information, see Generics in .NET.

물론, 사용자 지정 제네릭 형식 및 메서드를 만들어 형식이 안전하고 효율적인 일반화된 솔루션 및 디자인 패턴을 직접 제공할 수도 있습니다.Of course, you can also create custom generic types and methods to provide your own generalized solutions and design patterns that are type-safe and efficient. 다음 코드 예제에서는 데모용으로 간단한 제네릭 연결된 목록 클래스를 보여 줍니다.The following code example shows a simple generic linked-list class for demonstration purposes. 대부분의 경우 직접 만드는 대신 .NET Framework 클래스 라이브러리에서 제공하는 List<T> 클래스를 사용해야 합니다. 형식 매개 변수 T는 일반적으로 구체적인 형식을 사용하여 목록에 저장된 항목의 형식을 나타내는 여러 위치에서 사용되며,(In most cases, you should use the List<T> class provided by the .NET Framework class library instead of creating your own.) The type parameter T is used in several locations where a concrete type would ordinarily be used to indicate the type of the item stored in the list. 다음과 같은 방법으로 사용됩니다.It is used in the following ways:

  • AddHead 메서드에서 메서드 매개 변수의 형식.As the type of a method parameter in the AddHead method.

  • 중첩 Node 클래스에서 Data 속성의 반환 형식.As the return type of the Data property in the nested Node class.

  • 중첩 클래스에서 private 멤버 data의 형식.As the type of the private member data in the nested class.

T는 중첩 Node 클래스에 사용할 수 있습니다.Note that T is available to the nested Node class. GenericList<T>GenericList<int>와 같이 구체적인 형식으로 인스턴스화되면 T가 나타날 때마다 int로 바뀝니다.When GenericList<T> is instantiated with a concrete type, for example as a GenericList<int>, each occurrence of T will be replaced with 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> 클래스를 사용하여 정수 목록을 만드는 방법을 보여 줍니다.The following code example shows how client code uses the generic GenericList<T> class to create a list of integers. 형식 인수를 변경하기만 하면 다음 코드를 쉽게 수정하여 문자열이나 다른 모든 사용자 지정 형식 목록을 만들 수 있습니다.Simply by changing the type argument, the following code could easily be modified to create lists of strings or any other custom type:

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");
    }
}

제네릭 개요Generics Overview

  • 제네릭 형식을 사용하여 코드 재사용, 형식 안전성 및 성능을 최대화합니다.Use generic types to maximize code reuse, type safety, and performance.

  • 가장 일반적으로 제네릭은 컬렉션 클래스를 만드는 데 사용됩니다.The most common use of generics is to create collection classes.

  • .NET Framework 클래스 라이브러리에는 System.Collections.Generic 네임스페이스에 여러 가지 새로운 제네릭 컬렉션 클래스가 포함됩니다.The .NET Framework class library contains several new generic collection classes in the System.Collections.Generic namespace. 이러한 제네릭 컬렉션 클래스는 가능할 때마다 System.Collections 네임스페이스의 ArrayList처럼 클래스 대신 사용되어야 합니다.These should be used whenever possible instead of classes such as ArrayList in the System.Collections namespace.

  • 사용자 고유의 제네릭 인터페이스, 클래스, 메서드, 이벤트 및 대리자를 만들 수 있습니다.You can create your own generic interfaces, classes, methods, events and delegates.

  • 제네릭 클래스는 특정 데이터 형식의 메서드에 액세스할 수 있도록 제한될 수 있습니다.Generic classes may be constrained to enable access to methods on particular data types.

  • 제네릭 데이터 형식에 사용되는 형식에 대한 정보는 리플렉션을 사용하여 런타임 시 얻을 수 있습니다.Information on the types that are used in a generic data type may be obtained at run-time by using reflection.

추가 정보For more information:

C# 언어 사양C# Language Specification

자세한 내용은 C# 언어 사양을 참조하세요.For more information, see the C# Language Specification.

참고 항목See also