예제가 포함된 C# 컬렉션 튜토리얼

⚡ 스마트 요약

C#의 컬렉션은 객체 그룹을 저장하고 관리하는 유연한 방법을 제공합니다. 배열과 달리 컬렉션은 런타임에 크기가 커지거나 작아지며, System.Collections 및 System.Collections.Generic 네임스페이스는 리스트, 딕셔너리, 스택, 큐에 대한 기성 형식을 제공합니다.

  • 🔃 동적 크기 조정: 컬렉션은 런타임에 요소를 추가하고 제거하므로 배열처럼 크기를 미리 고정할 수 없습니다.
  • 📚 네임스페이스: System.Collections.Collections에는 제네릭이 아닌 형식이 저장되고, System.Collections.Generic에는 형식 안전 제네릭 형식이 저장됩니다.
  • 🧱 핵심 과목: ArrayList, Stack, Queue, Hashtable, SortedList 및 BitArray는 일반적인 비제네릭 요구 사항을 충족합니다.
  • 일반 전력: List, Dictionary, HashSet 및 Queue는 컴파일 타임 타입 안전성과 향상된 성능을 제공합니다.
  • 🔑 올바른 선택: 키 조회를 위해 딕셔너리를, 정렬된 항목을 위해 리스트를, 그리고 LIFO 또는 FIFO 순서 지정을 위해 스택이나 큐를 사용하세요.
  • 🤖 AI 지원: GitHub Copilot은 컬렉션 코드의 구조를 만들고, ML.NET 파이프라인은 제네릭 컬렉션 형식을 통해 데이터를 전달합니다.

C#에서의 컬렉션

이전 튜토리얼에서는 C#에서 배열을 사용하는 방법에 대해 배웠습니다. 이에 대한 간략한 개요를 살펴보겠습니다. 프로그래밍에서 배열은 관련 개체 집합을 그룹화하는 데 사용됩니다. 따라서 하나의 변수 이름을 통해 액세스할 수 있는 배열이나 정수 집합을 만들 수 있습니다.

C#의 컬렉션이란 무엇입니까?

컬렉션은 다음과 유사합니다. 배열, 개체 그룹으로 작업하는 보다 유연한 방법을 제공합니다.

배열에서는 배열의 요소 수를 미리 정의해야 한다는 점을 알아차렸을 것입니다. 이는 배열이 선언될 때 수행되어야 했습니다.

그러나 컬렉션에서는 컬렉션의 크기를 미리 정의할 필요가 없습니다. 언제든지 컬렉션에서 요소를 추가하거나 제거할 수도 있습니다. 이 장에서는 C#에서 사용할 수 있는 다양한 컬렉션을 사용하여 작업하는 방법에 중점을 둘 것입니다.

System.Collections 클래스

.NET 프레임워크는 기존의 비제네릭 컬렉션 클래스들을 System.Collections 네임스페이스에 그룹화합니다. 아래 표는 바로 사용할 수 있는 주요 형식을 요약한 것입니다.

수집 기술설명
ArrayList ArrayList 컬렉션은 Arrays 컬렉션과 유사합니다. C#의 데이터 유형. 가장 큰 차이점은 배열 목록 컬렉션의 동적 특성입니다.
스택 스택은 후입선출(LIFO) 개념을 나타내는 특별한 유형의 컬렉션입니다.
큐는 선입선출(FIFO) 개념을 나타내는 특별한 유형의 컬렉션입니다.
해시 테이블 해시 테이블은 키-값 관계를 저장하는 데 사용되는 특별한 모음입니다.
정렬된 목록 SortedList는 기본적으로 키의 오름차순으로 키-값 쌍을 저장하는 컬렉션입니다.
비트어레이 비트 배열은 비트를 저장하는 데이터 구조의 배열입니다.

C#에서의 제네릭 컬렉션

위의 제네릭이 아닌 클래스들은 모든 요소를 ​​일반 객체로 저장하기 때문에 컴파일러가 형식을 검사할 수 없고, 프로그램은 값 박싱에 약간의 비용을 지불하게 됩니다. 이러한 문제를 해결하기 위해 C#에서는 System.Collections.Generic 네임스페이스를 추가했으며, 이 네임스페이스에서 각 컬렉션은 선언된 하나의 형식에 바인딩됩니다.

List와 같은 일반적인 컬렉션 문자열만 허용하므로 컴파일 시간에 오류가 감지되고 항목을 다시 읽을 때 형변환이 필요하지 않습니다. 이러한 특징 덕분에 제네릭 컬렉션은 더 안전하고 빠르며 읽기 쉽습니다. 이것이 바로 현대 C# 코드에서 기본적으로 사용되는 이유입니다.

가장 일반적인 일반 컬렉션은 다음과 같습니다.

  • 목록 : 크기 조절이 가능하고 인덱스를 기반으로 하는 리스트로, ArrayList를 대체하는 일반적인 클래스입니다.
  • 사전 : 키-값 쌍을 저장하고 해시 기반 조회를 통해 빠르게 데이터를 가져옵니다.
  • 해시셋 : 고유한 값만 저장하며 합집합과 같은 집합 연산을 지원합니다.
  • 대기줄 : 선입선출 방식의 데이터 수집으로, 큐의 일반적인 버전입니다.
  • 스택 : 후입선출 방식의 컬렉션으로, Stack의 일반적인 버전입니다.
  • 정렬된 목록 : 키-값 쌍을 키를 기준으로 오름차순으로 정렬하여 유지합니다.

C# 리스트 컬렉션 예제

List는 동적 배열처럼 동작하기 때문에 가장 널리 사용되는 제네릭 컬렉션입니다. 아래 예제는 문자열 리스트를 생성하고, 항목을 추가 및 제거하고, 리스트의 크기를 읽은 후, 남은 값을 출력합니다. 모든 코드는 Program.cs 파일에 작성되어 있습니다.

단계 1) System.Collections.Generic 네임스페이스를 가져오고 문자열 목록을 선언합니다.

단계 2) Add 메서드를 사용하여 항목을 추가하고 Remove 메서드를 사용하여 항목을 삭제합니다.

단계 3) Count 속성을 읽은 다음 foreach 문을 사용하여 목록을 순회합니다.

using System;
using System.Collections.Generic;
namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   List<string> tutorials = new List<string>();
   tutorials.Add("Java");
   tutorials.Add("Python");
   tutorials.Add("Kotlin");
   tutorials.Remove("Python");
   Console.WriteLine(tutorials.Count);
   foreach (string tutorial in tutorials)
   {
    Console.WriteLine(tutorial);
   }
   Console.ReadKey();
  }
 }
}

Code 설명:-

  1. System.Collections.Generic 네임스페이스를 가져와서 프로그램에서 List 형식을 사용할 수 있게 되었습니다.
  2. 새로운 목록 tutorials라는 이름의 객체가 생성되고, Add 메서드를 사용하여 세 개의 이름이 추가됩니다.
  3. Remove 메서드는 " 값을 삭제합니다.Python그러면 목록에는 두 개의 항목이 남습니다.
  4. Count 속성은 항목 수를 반환하고, foreach 루프는 나머지 값을 순서대로 출력합니다.

프로그램이 실행되면 먼저 개수를 출력합니다. 2, 다음 Java 코 틀린 각 줄에 따로 표시됩니다. 이는 컬렉션이 런타임에 크기를 변경하는 방식을 보여주는데, 고정 배열은 이러한 기능을 제공하지 못합니다.

C#에서 배열과 컬렉션의 차이점

둘 다 정렬 컬렉션은 관련 항목들을 하나의 이름으로 묶지만, 프로그램이 실행되면 서로 다르게 동작합니다. 각각을 언제 사용해야 하는지 알면 더 깔끔하고 효율적인 코드를 작성하는 데 도움이 됩니다.

주요 차이점은 다음과 같습니다.

  • 크기 : 배열은 선언 시 길이가 고정되는 반면, 컬렉션은 언제든지 크기가 커지거나 작아질 수 있습니다.
  • 타입 처리: 배열은 단일 유형의 객체를 저장하는 반면, 컬렉션은 제네릭을 사용하면 유형 안전성을 보장할 수 있고, 제네릭을 사용하지 않을 경우 여러 유형의 객체를 혼합하여 저장할 수 있습니다.
  • 위치: 배열은 언어 자체에 내장되어 있으며, 컬렉션 클래스는 System.Collections 및 System.Collections.Generic 네임스페이스에 있습니다.
  • 내장 기능: 컬렉션은 항목을 추가, 제거, 검색 및 정렬하는 간편한 방법을 제공하는 반면, 배열은 기본적인 인덱스 접근만 제공합니다.
  • 최고의 사용: 항목 수가 알려져 있고 고정되어 있을 때는 배열을 선택하고, 프로그램 실행 중에 항목 수가 변경될 때는 컬렉션을 선택하십시오.

요약하자면, 배열은 고정 크기 데이터에 가장 적합하고, 컬렉션은 대부분의 실제 응용 프로그램에 필요한 유연성을 제공합니다.

자주 묻는 질문

레코드에 매핑된 ID와 같은 고유 키를 사용하여 빠르게 값을 찾아야 할 때는 딕셔너리를 사용하세요. 딕셔너리는 거의 상수 시간 안에 값을 찾을 수 있는 반면, 리스트는 항목을 하나씩 순차적으로 검색해야 합니다.

HashSet과 Dictionary는 해싱을 사용하여 거의 상수 시간 안에 요소에 접근하기 때문에 가장 빠른 검색 속도를 제공합니다. List나 배열은 모든 요소를 ​​순차적으로 확인해야 할 수 있으므로 속도가 더 느립니다.

동시성 컬렉션은 System.Collections.Concurrent 네임스페이스에 있으며 멀티스레드 코드를 위해 설계되었습니다. ConcurrentDictionary 및 BlockingCollection과 같은 형식을 사용하면 여러 스레드가 수동 잠금 없이 안전하게 항목을 추가하고 제거할 수 있습니다.

IEnumerable은 foreach 루프를 사용하여 항목을 읽는 것만 지원하는 기본 인터페이스입니다. ICollection은 이를 확장하여 Count, Add, Remove와 같은 멤버를 추가하므로 컬렉션을 수정하는 것도 지원합니다.

List는 선언된 하나의 타입을 저장하는 제네릭 타입 안전 컬렉션으로, 컴파일 타임 검사를 통해 성능을 향상시킵니다. ArrayList는 비제네릭 타입으로, 모든 항목을 객체로 저장하므로 형변환이 필요하며 여러 타입을 혼합하여 사용할 수 있습니다.

스택은 후입선출(LIFO) 방식으로 작동하므로, 팝(Pop) 함수를 사용하면 가장 최근에 추가된 항목이 먼저 제거됩니다. 큐는 선입선출(FIFO) 방식으로 작동하므로, 디큐(Dequeue) 함수를 사용하면 가장 오래된 항목이 먼저 제거됩니다.

네. GitHub Copilot은 적절한 컬렉션 유형을 제안하고, 항목을 추가하거나 필터링하는 루프를 생성하며, 간단한 댓글만으로 LINQ 쿼리를 완성하여 목록, 사전 및 기타 컬렉션 작업 속도를 향상시켜 줍니다.

ML.NET은 List 및 IEnumerable과 같은 컬렉션을 통해 학습 데이터를 제공하며, 이러한 컬렉션은 IDataView 파이프라인에 매핑됩니다. 강력한 형식의 제네릭 컬렉션에 샘플을 저장하면 머신 러닝 워크플로가 명확하고 형식 안전성이 유지됩니다.

이 게시물을 요약하면 다음과 같습니다.