List 제네릭 클래스 (System.Collections.Generic)

보기 전환:
ScriptFree
.NET Framework 클래스 라이브러리
List 제네릭 클래스

참고: 이 클래스는 .NET Framework 버전 2.0에서 새로 추가되었습니다.

인덱스로 액세스할 수 있는 강력한 형식의 개체 목록을 나타냅니다. 목록의 검색, 정렬 및 조작에 사용할 수 있는 메서드를 제공합니다.

네임스페이스: System.Collections.Generic
어셈블리: mscorlib(mscorlib.dll)

구문

Visual Basic(선언)
<SerializableAttribute> _
Public Class List(Of T)
	Implements IList(Of T), ICollection(Of T), _
	IEnumerable(Of T), IList, ICollection, _
	IEnumerable
Visual Basic(사용법)
Dim instance As List(Of T)

C#
[SerializableAttribute] 
public class List<T> : IList<T>, ICollection<T>, 
	IEnumerable<T>, IList, ICollection, IEnumerable
C++
[SerializableAttribute] 
generic<typename T>
public ref class List : IList<T>, ICollection<T>, 
	IEnumerable<T>, IList, ICollection, IEnumerable
J#
J#에서는 제네릭 형식 및 메서드를 사용할 수 있지만 새로 선언할 수는 없습니다.
JScript
JScript에서는 제네릭 형식 및 메서드를 지원하지 않습니다.

Type 매개 변수

T

목록에 있는 요소의 형식입니다.

설명

List 클래스는 ArrayList 클래스의 제네릭 형태에 해당합니다. 이 클래스는 필요에 따라 크기가 동적으로 증가하는 배열을 사용하여 IList 제네릭 인터페이스를 구현합니다.

List 클래스는 같음 비교자와 순서 비교자를 모두 사용합니다.

  • Contains, IndexOf, LastIndexOfRemove와 같은 메서드는 목록 요소에 대해 같음 비교자를 사용합니다. T 형식의 기본 같음 비교자는 다음과 같이 결정됩니다. T 형식이 IEquatable 제네릭 인터페이스를 구현하면 같음 비교자가 해당 인터페이스의 Equals 메서드이고, 그렇지 않으면 기본 같음 비교자가 Object.Equals(Object)입니다.

  • BinarySearchSort와 같은 메서드는 목록 요소에 대해 순서 비교자를 사용합니다. T 형식의 기본 비교자는 다음과 같이 결정됩니다. T 형식이 IComparable 제네릭 인터페이스를 구현하면 기본 비교자가 해당 인터페이스의 CompareTo 메서드이고, T 형식이 제네릭이 아닌 IComparable 인터페이스를 구현하면 기본 비교자가 해당 인터페이스의 CompareTo 메서드입니다. T 형식이 두 인터페이스 중 하나를 구현하지 않으면 기본 비교자가 없으므로 비교자나 비교 대리자가 명시적으로 제공되어야 합니다.

List는 정렬되어 있지 않을 수 있으므로 List이 정렬되어 있어야 하는 BinarySearch와 같은 작업을 수행하기 전에는 List을 정렬해야 합니다.

이 컬렉션에 있는 요소는 정수 인덱스를 사용하여 액세스할 수 있습니다. 이 컬렉션의 인덱스는 0부터 시작합니다.

List은 Null 참조(Visual Basic의 경우 Nothing)을 참조 형식에 대해 유효한 값으로 받아들이며 중복 요소를 허용합니다.

성능 고려 사항

비슷한 기능을 가진 List 클래스와 ArrayList 클래스 중에서 사용할 것을 결정할 때 List 클래스가 대부분의 경우 성능이 좋으며 형식 안전적임을 고려합니다. 참조 형식이 List 클래스의 T 형식에 사용되는 경우 두 클래스의 동작은 동일합니다. 그러나 값 형식이 T 형식에 사용되는 경우에는 구현과 boxing 문제를 고려해야 합니다.

값 형식이 T 형식에 사용되는 경우에는 컴파일러에서 해당 값 형식에 특정한 List 클래스의 구현을 생성합니다. 즉, List 개체의 목록 요소를 boxing하지 않아도 요소를 사용할 수 있으며, 500개 정도의 목록 요소가 만들어진 후 boxing하지 않는 목록 요소를 저장한 메모리가 클래스 구현을 생성하는 데 사용된 메모리보다 큽니다.

T 형식에 사용된 값 형식이 IEquatable 제네릭 인터페이스를 구현하는지 확인하십시오. 그렇지 않은 경우 Contains와 같은 메서드는 영향을 받는 목록 요소를 boxing하는 Object.Equals(Object) 메서드를 호출해야 합니다. 값 형식이 IComparable 인터페이스를 구현하는 경우 소스 코드를 소유하고 있으면 BinarySearchSort 메서드가 목록 요소를 boxing하는 것을 방지하기 위해 IComparable 제네릭 인터페이스도 구현합니다. 소스 코드를 소유하지 않은 경우에는 IComparer 개체를 BinarySearchSort 메서드에 전달합니다.

ArrayList 클래스를 사용하거나 강력한 형식의 래퍼 컬렉션을 직접 작성하는 대신 List 클래스의 형식별 구현을 사용하는 것이 좋습니다. 그 이유는 사용자 구현에서는 .NET Framework에서 이미 사용자를 위해 수행하는 작업을 수행해야 하고 공용 언어 런타임처럼 Microsoft Intermediate Language 코드와 메타데이터를 공유할 수 없기 때문입니다.

예제

다음 코드 예제에서는 List 제네릭 클래스의 몇 가지 속성과 메서드를 보여 줍니다. 이 예제에서는 기본 생성자를 사용하여 용량이 0인 문자열 목록을 만들고 Capacity 속성을 표시한 다음 Add 메서드를 사용하여 몇 가지 항목을 추가합니다. 그런 다음 항목을 나열하고 Count 속성과 함께 Capacity 속성을 다시 표시하여 용량이 필요한 만큼 증가했음을 보여 줍니다.

Contains 메서드를 사용하여 목록에 항목이 있는지 테스트하고 Insert 메서드를 사용하여 목록의 중간에 새 항목을 삽입한 다음 목록의 내용을 다시 표시합니다.

기본 Item 속성(C#의 경우 인덱서)을 사용하여 항목을 검색하고 Remove 메서드를 사용하여 이전에 추가된 중복 항목의 첫 번째 인스턴스를 제거한 다음 내용을 다시 표시합니다. Remove 메서드는 항상 발견한 첫 번째 인스턴스를 제거합니다.

TrimExcess 메서드를 사용하여 개수와 일치하도록 용량을 줄이고 CapacityCount 속성을 표시합니다. 사용하지 않은 용량이 총 용량의 10%보다 작으면 목록의 크기가 조정되지 않습니다.

마지막으로 Clear 메서드를 사용하여 목록에서 항목을 모두 제거하고 CapacityCount 속성을 표시합니다.

Visual Basic
Imports System
Imports System.Collections.Generic

Public Class Example

    Public Shared Sub Main()

        Dim dinosaurs As New List(Of String)

        Console.WriteLine(vbLf & "Capacity: {0}", dinosaurs.Capacity)

        dinosaurs.Add("Tyrannosaurus")
        dinosaurs.Add("Amargasaurus")
        dinosaurs.Add("Mamenchisaurus")
        dinosaurs.Add("Deinonychus")
        dinosaurs.Add("Compsognathus")

        Console.WriteLine()
        For Each dinosaur As String In dinosaurs
            Console.WriteLine(dinosaur)
        Next

        Console.WriteLine(vbLf & "Capacity: {0}", dinosaurs.Capacity)
        Console.WriteLine("Count: {0}", dinosaurs.Count)

        Console.WriteLine(vbLf & "Contains(""Deinonychus""): {0}", _
            dinosaurs.Contains("Deinonychus"))

        Console.WriteLine(vbLf & "Insert(2, ""Compsognathus"")")
        dinosaurs.Insert(2, "Compsognathus")

        Console.WriteLine()
        For Each dinosaur As String In dinosaurs
            Console.WriteLine(dinosaur)
        Next

        Console.WriteLine(vbLf & "dinosaurs(3): {0}", dinosaurs(3))

        Console.WriteLine(vbLf & "Remove(""Compsognathus"")")
        dinosaurs.Remove("Compsognathus")

        Console.WriteLine()
        For Each dinosaur As String In dinosaurs
            Console.WriteLine(dinosaur)
        Next

        dinosaurs.TrimExcess()
        Console.WriteLine(vbLf & "TrimExcess()")
        Console.WriteLine("Capacity: {0}", dinosaurs.Capacity)
        Console.WriteLine("Count: {0}", dinosaurs.Count)

        dinosaurs.Clear()
        Console.WriteLine(vbLf & "Clear()")
        Console.WriteLine("Capacity: {0}", dinosaurs.Capacity)
        Console.WriteLine("Count: {0}", dinosaurs.Count)
    End Sub
End Class

' This code example produces the following output:
'
'Capacity: 0
'
'Tyrannosaurus
'Amargasaurus
'Mamenchisaurus
'Deinonychus
'Compsognathus
'
'Capacity: 8
'Count: 5
'
'Contains("Deinonychus"): True
'
'Insert(2, "Compsognathus")
'
'Tyrannosaurus
'Amargasaurus
'Compsognathus
'Mamenchisaurus
'Deinonychus
'Compsognathus
'
'dinosaurs(3): Mamenchisaurus
'
'Remove("Compsognathus")
'
'Tyrannosaurus
'Amargasaurus
'Mamenchisaurus
'Deinonychus
'Compsognathus
'
'TrimExcess()
'Capacity: 5
'Count: 5
'
'Clear()
'Capacity: 5
'Count: 0

C#
using System;
using System.Collections.Generic;

public class Example
{
    public static void Main()
    {
        List<string> dinosaurs = new List<string>();

        Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity);

        dinosaurs.Add("Tyrannosaurus");
        dinosaurs.Add("Amargasaurus");
        dinosaurs.Add("Mamenchisaurus");
        dinosaurs.Add("Deinonychus");
        dinosaurs.Add("Compsognathus");

        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }

        Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity);
        Console.WriteLine("Count: {0}", dinosaurs.Count);

        Console.WriteLine("\nContains(\"Deinonychus\"): {0}",
            dinosaurs.Contains("Deinonychus"));

        Console.WriteLine("\nInsert(2, \"Compsognathus\")");
        dinosaurs.Insert(2, "Compsognathus");

        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }

        Console.WriteLine("\ndinosaurs[3]: {0}", dinosaurs[3]);

        Console.WriteLine("\nRemove(\"Compsognathus\")");
        dinosaurs.Remove("Compsognathus");

        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }

        dinosaurs.TrimExcess();
        Console.WriteLine("\nTrimExcess()");
        Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
        Console.WriteLine("Count: {0}", dinosaurs.Count);

        dinosaurs.Clear();
        Console.WriteLine("\nClear()");
        Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
        Console.WriteLine("Count: {0}", dinosaurs.Count);
    }
}

/* This code example produces the following output:

Capacity: 0

Tyrannosaurus
Amargasaurus
Mamenchisaurus
Deinonychus
Compsognathus

Capacity: 8
Count: 5

Contains("Deinonychus"): True

Insert(2, "Compsognathus")

Tyrannosaurus
Amargasaurus
Compsognathus
Mamenchisaurus
Deinonychus
Compsognathus

dinosaurs[3]: Mamenchisaurus

Remove("Compsognathus")

Tyrannosaurus
Amargasaurus
Mamenchisaurus
Deinonychus
Compsognathus

TrimExcess()
Capacity: 5
Count: 5

Clear()
Capacity: 5
Count: 0
 */

C++
using namespace System;
using namespace System::Collections::Generic;

void main()
{
    List<String^>^ dinosaurs = gcnew List<String^>();

    Console::WriteLine("\nCapacity: {0}", dinosaurs->Capacity);

    dinosaurs->Add("Tyrannosaurus");
    dinosaurs->Add("Amargasaurus");
    dinosaurs->Add("Mamenchisaurus");
    dinosaurs->Add("Deinonychus");
    dinosaurs->Add("Compsognathus");

    Console::WriteLine();
    for each(String^ dinosaur in dinosaurs )
    {
        Console::WriteLine(dinosaur);
    }

    Console::WriteLine("\nCapacity: {0}", dinosaurs->Capacity);
    Console::WriteLine("Count: {0}", dinosaurs->Count);

    Console::WriteLine("\nContains(\"Deinonychus\"): {0}",
        dinosaurs->Contains("Deinonychus"));

    Console::WriteLine("\nInsert(2, \"Compsognathus\")");
    dinosaurs->Insert(2, "Compsognathus");

    Console::WriteLine();
    for each(String^ dinosaur in dinosaurs )
    {
        Console::WriteLine(dinosaur);
    }

    Console::WriteLine("\ndinosaurs[3]: {0}", dinosaurs[3]);

    Console::WriteLine("\nRemove(\"Compsognathus\")");
    dinosaurs->Remove("Compsognathus");

    Console::WriteLine();
    for each(String^ dinosaur in dinosaurs )
    {
        Console::WriteLine(dinosaur);
    }

    dinosaurs->TrimExcess();
    Console::WriteLine("\nTrimExcess()");
    Console::WriteLine("Capacity: {0}", dinosaurs->Capacity);
    Console::WriteLine("Count: {0}", dinosaurs->Count);

    dinosaurs->Clear();
    Console::WriteLine("\nClear()");
    Console::WriteLine("Capacity: {0}", dinosaurs->Capacity);
    Console::WriteLine("Count: {0}", dinosaurs->Count);
}

/* This code example produces the following output:

Capacity: 0

Tyrannosaurus
Amargasaurus
Mamenchisaurus
Deinonychus
Compsognathus

Capacity: 8
Count: 5

Contains("Deinonychus"): True

Insert(2, "Compsognathus")

Tyrannosaurus
Amargasaurus
Compsognathus
Mamenchisaurus
Deinonychus
Compsognathus

dinosaurs[3]: Mamenchisaurus

Remove("Compsognathus")

Tyrannosaurus
Amargasaurus
Mamenchisaurus
Deinonychus
Compsognathus

TrimExcess()
Capacity: 5
Count: 5

Clear()
Capacity: 5
Count: 0
 */

상속 계층 구조

System.Object
  System.Collections.Generic.List
스레드로부터의 안전성

이 형식의 public static(Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 모든 인스턴스 멤버는 스레드로부터 안전하지 않을 수 있습니다.

List는 컬렉션이 수정되지 않으면 여러 개의 reader를 동시에 지원할 수 있습니다. 컬렉션을 열거하는 프로시저는 기본적으로 스레드로부터 안전하지 않습니다. 열거 작업에서 하나 이상의 쓰기 액세스와 경쟁하는 드문 경우에 스레드로부터 안전하게 보호하는 유일한 방법은 열거하는 동안 컬렉션을 잠그는 것입니다. 여러 스레드에서 컬렉션에 액세스하여 읽고 쓸 수 있도록 허용하려면 사용자 지정 동기화를 구현해야 합니다.

플랫폼

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.

버전 정보

.NET Framework

2.0에서 지원

.NET Compact Framework

2.0에서 지원
참고 항목