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

제네릭 클래스 및 메서드는 제네릭이 아닌 클래스 및 메서드에서는 결합할 수 없는 방식으로 재사용성, 형식 안전성 및 효율성을 결합합니다.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");
    }
}

참고 항목See Also

System.Collections.Generic
C# 프로그래밍 가이드C# Programming Guide
제네릭Generics