C에서 목록<T> 를 사용하여 데이터 수집을 관리하는 방법 알아보기#

이 소개 자습서에서는 C# 언어 및 List<T> 클래스의 기본 사항을 소개합니다.

사전 준비 사항

이 자습서에서는 컴퓨터가 로컬 개발용으로 설정되어 있다고 가정합니다. 설치 지침 및 .NET의 애플리케이션 개발 개요는 로컬 환경 설정을 참조하세요 .

로컬 환경을 설정하지 않고 코드를 실행하려는 경우 이 자습서의 브라우저 내 대화형 버전을 참조하세요.

기본 목록 예제

list-tutorial이라는 디렉터리를 만듭니다. 현재 디렉터리로 지정하고 dotnet new console을 실행합니다.

중요

.NET 6 용 C# 템플릿은 ‘최상위 문’을 사용합니다. .NET 6으로 이미 업그레이드한 경우 애플리케이션이 이 문서의 코드와 일치하지 않을 수 있습니다. 자세한 내용은 최상위 문을 생성하는 새 C# 템플릿을 참조하세요.

.NET 6 SDK는 다음 SDK를 사용하는 프로젝트에 대한 암시적global using 지시문 집합도 추가합니다.

  • Microsoft.NET.Sdk
  • Microsoft.NET.Sdk.Web
  • Microsoft.NET.Sdk.Worker

이러한 암시적 global using 지시문에는 해당 프로젝트 형식의 가장 일반적인 네임스페이스가 포함됩니다.

자세한 내용은 암시적 using 지시문 문서를 참조하세요.

편집기에서 Program.cs를 열고 기존 코드를 다음으로 바꿉니다.

List<string> names = ["<name>", "Ana", "Felipe"];
foreach (var name in names)
{
    Console.WriteLine($"Hello {name.ToUpper()}!");
}

<name>을 사용자의 이름으로 바꿉니다. Program.cs를 저장합니다. 콘솔 창에 dotnet run을 입력하여 시도해 보세요.

문자열 목록을 만들고, 해당 목록에 세 개의 이름을 추가하고, 모든 CAPS에 이름을 인쇄했습니다. 이전 자습서에서 학습한 개념을 사용하여 목록을 반복합니다.

이름을 표시하는 코드는 문자열 보간 기능을 사용합니다. string 앞에 $ 문자를 넣으면 문자열 선언에 C# 코드를 포함할 수 있습니다. 실제 문자열은 C# 코드를 생성하는 값으로 바꿉니다. 이 예제에서는 ToUpper 메서드를 호출했기 때문에 {name.ToUpper()}를 대문자로 변환된 각 이름으로 바꿉니다.

계속해서 살펴보겠습니다.

목록 콘텐츠 수정

생성한 컬렉션은 List<T> 형식을 사용합니다. 이 형식은 요소의 시퀀스를 저장합니다. 꺾쇠 괄호 사이의 요소 형식을 지정합니다.

List<T> 형식은 늘리거나 줄일 수 있어 요소를 추가하거나 제거할 수 있습니다. 이 코드를 프로그램 끝에 추가합니다.

Console.WriteLine();
names.Add("Maria");
names.Add("Bill");
names.Remove("Ana");
foreach (var name in names)
{
    Console.WriteLine($"Hello {name.ToUpper()}!");
}

목록 끝에 이름을 두 개 더 추가했습니다. 또한 이름을 하나 제거했습니다. 파일을 저장하고 dotnet run을 입력하여 시도해 보세요.

List<T>를 사용하면 인덱스별로 각 항목을 참조할 수도 있습니다. 목록 이름 뒤 [] 토큰 사이에 인덱스를 배치합니다. C#은 첫 번째 인덱스에 0을 사용합니다. 방금 추가한 코드 바로 아래에 이 코드를 추가하여 시도합니다.

Console.WriteLine($"My name is {names[0]}");
Console.WriteLine($"I've added {names[2]} and {names[3]} to the list");

목록의 끝을 벗어나는 인덱스에 액세스할 수 없습니다. 인덱스는 0부터 시작하므로, 가장 큰 유효 인덱스는 목록의 항목 수보다 하나 작습니다. Count 속성을 사용하여 목록의 길이를 확인할 수 있습니다. 프로그램 끝에 다음 코드를 추가합니다.

Console.WriteLine($"The list has {names.Count} people in it");

파일을 저장하고 dotnet run을 다시 입력하여 결과를 확인합니다.

목록 검색 및 정렬

샘플에서는 상대적으로 작은 목록을 사용하지만 애플리케이션에서는 수천에 달하는 많은 요소가 포함된 목록을 작성할 수 있습니다. 이러한 큰 컬렉션에서 요소를 찾으려면 여러 항목의 목록을 검색해야 합니다. IndexOf 메서드는 항목을 검색하고 항목의 인덱스를 반환합니다. 목록에 항목이 없으면 IndexOf-1을 반환합니다. 프로그램 맨 아래에 이 코드를 추가합니다.

var index = names.IndexOf("Felipe");
if (index == -1)
{
    Console.WriteLine($"When an item is not found, IndexOf returns {index}");
}
else
{
    Console.WriteLine($"The name {names[index]} is at index {index}");
}

index = names.IndexOf("Not Found");
if (index == -1)
{
    Console.WriteLine($"When an item is not found, IndexOf returns {index}");
}
else
{
    Console.WriteLine($"The name {names[index]} is at index {index}");

}

목록의 항목도 정렬할 수 있습니다. Sort 메서드는 일반적인 순서(문자열의 경우 사전순)로 목록의 모든 항목을 정렬합니다. 프로그램 맨 아래에 이 코드를 추가합니다.

names.Sort();
foreach (var name in names)
{
    Console.WriteLine($"Hello {name.ToUpper()}!");
}

파일을 저장하고 dotnet run을 입력하여 이 최신 버전을 사용해 보세요.

다음 섹션을 시작하기 전에 현재 코드를 별도의 메서드로 이동합니다. 이렇게 하면 새 예제 작업을 쉽게 시작할 수 있습니다. 작성한 모든 코드를 WorkWithStrings()라는 새 메서드에 넣습니다. 프로그램 위에서 해당 메서드를 호출합니다. 작업을 마치면 코드가 다음과 같이 됩니다.

WorkWithStrings();

void WorkWithStrings()
{
    List<string> names = ["<name>", "Ana", "Felipe"];
    foreach (var name in names)
    {
        Console.WriteLine($"Hello {name.ToUpper()}!");
    }

    Console.WriteLine();
    names.Add("Maria");
    names.Add("Bill");
    names.Remove("Ana");
    foreach (var name in names)
    {
        Console.WriteLine($"Hello {name.ToUpper()}!");
    }

    Console.WriteLine($"My name is {names[0]}");
    Console.WriteLine($"I've added {names[2]} and {names[3]} to the list");

    Console.WriteLine($"The list has {names.Count} people in it");

    var index = names.IndexOf("Felipe");
    if (index == -1)
    {
        Console.WriteLine($"When an item is not found, IndexOf returns {index}");
    }
    else
    {
        Console.WriteLine($"The name {names[index]} is at index {index}");
    }

    index = names.IndexOf("Not Found");
    if (index == -1)
    {
        Console.WriteLine($"When an item is not found, IndexOf returns {index}");
    }
    else
    {
        Console.WriteLine($"The name {names[index]} is at index {index}");

    }

    names.Sort();
    foreach (var name in names)
    {
        Console.WriteLine($"Hello {name.ToUpper()}!");
    }
}

다른 형식 목록

지금까지 목록에 string 형식을 사용했습니다. 다른 형식을 사용하여 List<T>를 만들어 보겠습니다. 숫자 집합을 빌드하겠습니다.

WorkWithStrings()를 호출한 후 다음을 프로그램에 추가합니다.

List<int> fibonacciNumbers = [1, 1];

정수 목록을 만들고 처음 두 정수를 값 1로 설정합니다. 숫자 시퀀스인 피보나치 시퀀스의 첫 번째 두 값입니다. 다음 각 피보나치 수는 이전의 두 수의 합계를 사용하여 찾습니다. 이 코드를 추가합니다.

var previous = fibonacciNumbers[fibonacciNumbers.Count - 1];
var previous2 = fibonacciNumbers[fibonacciNumbers.Count - 2];

fibonacciNumbers.Add(previous + previous2);

foreach (var item in fibonacciNumbers)
{
    Console.WriteLine(item);
}

파일을 저장하고 dotnet run을 입력하여 결과를 확인합니다.

이 섹션에만 집중하려면 WorkWithStrings();를 호출하는 코드를 주석으로 처리할 수 있습니다. 두 / 문자를 다음과 같이 // WorkWithStrings();호출 앞에 넣습니다.

과제

이 단원과 이전 단원에서 학습한 개념을 함께 적용할 수 있는지 확인하세요. 피보나치 수를 사용하여 지금까지 빌드한 내용을 확장합니다. 코드를 작성하여 시퀀스에서 처음 20개 수를 생성합니다. (힌트: 20번째 피보나치 수는 6765입니다.)

과제 완료

GitHub에서 완료된 샘플 코드를 보고 예제 솔루션을 확인할 수 있습니다.

루프의 각 반복을 통해 목록의 마지막 두 정수를 사용하고, 더하고, 해당 값을 목록에 추가합니다. 목록에 20개의 항목이 추가될 때까지 루프가 반복됩니다.

축하합니다. 목록 자습서를 완료했습니다. 사용자의 개발 환경에서 추가 자습서를 계속 진행할 수 있습니다.

.NET 기본 사항 문서의 컬렉션에서 List 형식 작업에 대해 자세히 알아볼 수 있습니다. 다른 많은 컬렉션 형식에 대해서도 학습합니다.