제네릭 클래스 및 메서드

제네릭은 .NET에 형식 매개 변수의 개념을 소개합니다. 제네릭을 사용하면 코드에서 클래스 또는 메서드를 사용할 때까지 하나 이상의 형식 매개 변수 사양을 연기하는 클래스와 메서드를 디자인할 수 있습니다. 예를 들어 제네릭 형식 매개 변수 T를 사용하여 여기에 표시된 것처럼, 다른 클라이언트 코드에서 런타임 캐스팅 또는 boxing 작업에 대한 비용이나 위험을 발생하지 않고 사용할 수 있는 단일 클래스를 작성할 수 있습니다.

// 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());
    }
}

제네릭 클래스와 메서드는 재사용성, 형식 안전성 및 효율성을 제네릭이 아닌 클래스에서 사용할 수 없는 방식으로 결합합니다. 제네릭 형식 매개 변수는 컴파일 중에 형식 인수로 대체됩니다. 앞의 예제에서 컴파일러는 .로 int바뀝니다T. 제네릭은 컬렉션 및 해당 컬렉션에서 작동하는 메서드에서 가장 자주 사용됩니다. System.Collections.Generic 네임스페이스에는 몇 가지 제네릭 기반 컬렉션 클래스가 있습니다. 비제네릭 컬렉션(예: ArrayList 권장되지 않음)은 호환성 목적으로만 기본. 자세한 내용은 .NET의 제네릭을 참조하세요.

사용자 지정 제네릭 형식 및 메서드를 만들어 형식이 안전하고 효율적인 일반화된 솔루션 및 디자인 패턴을 직접 제공할 수도 있습니다. 다음 코드 예제에서는 데모용으로 간단한 제네릭 연결된 목록 클래스를 보여 줍니다. (대부분의 경우 직접 만드는 대신 .NET에서 제공하는 클래스를 사용해야 List<T> 합니다.) 형식 매개 변수 T 는 구체적인 형식이 일반적으로 목록에 저장된 항목의 형식을 나타내는 데 사용되는 여러 위치에서 사용됩니다.

  • AddHead 메서드에서 메서드 매개 변수의 형식.
  • 중첩 Node 클래스에서 Data 속성의 반환 형식.
  • 중첩 클래스에서 private 멤버 data의 형식.

T는 중첩된 Node 클래스에 사용할 수 있습니다. GenericList<T> 예를 들어 구체적인 형식으로 GenericList<int>인스턴스화되면 각 발생 T 항목이 .로 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> 클래스를 사용하여 정수 목록을 만드는 방법을 보여 줍니다. 형식 인수를 변경하는 경우 다음 코드는 문자열 목록 또는 다른 사용자 지정 형식을 만듭니다.

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

참고 항목

제네릭 형식은 클래스로 제한되지 않습니다. 앞의 예제에서는 형식을 사용 class 하지만 형식을 포함하여 record 제네릭 interfacestruct 형식을 정의할 수 있습니다.

제네릭 개요

  • 제네릭 형식을 사용하여 코드 재사용, 형식 안전성 및 성능을 최대화합니다.
  • 가장 일반적으로 제네릭은 컬렉션 클래스를 만드는 데 사용됩니다.
  • .NET 클래스 라이브러리에는 System.Collections.Generic 네임스페이스의 여러 제네릭 컬렉션 클래스가 포함됩니다. 제네릭 컬렉션은 가능할 때마다 System.Collections 네임스페이스의 ArrayList처럼 클래스 대신 사용되어야 합니다.
  • 사용자 고유의 제네릭 인터페이스, 클래스, 메서드, 이벤트 및 대리자를 만들 수 있습니다.
  • 제네릭 클래스는 특정 데이터 형식의 메서드에 액세스할 수 있도록 제한될 수 있습니다.
  • 리플렉션을 사용하여 제네릭 데이터 형식에 사용되는 형식에 대한 정보를 런타임에 가져올 수 있습니다.

C# 언어 사양

자세한 내용은 C# 언어 사양을 참조하세요.

참고 항목