프로그래밍 언어/C#

C#에서 배열과 리스트의 차이점 및 컬렉션 클래스 메모리 관리 방법 - C# 15

eco7T 2024. 10. 21. 10:47
반응형

C#의 컬렉션 클래스는 데이터를 관리하고 저장하는 데 필수적인 도구입니다. 다양한 데이터 구조와 기능을 제공하여 개발자들이 데이터를 효과적으로 처리할 수 있도록 도와줍니다. 컬렉션 클래스에 대해 실제 적용 가능한 예제 코드를 통해 각 컬렉션의 특징을 이해할 수 정리해 보겠습니다.

C# 컬렉션 클래스
C# 컬렉션 클래스

 

C# 프로그래밍 언어의 컬렉션 클래스 학습서

  1. 컬렉션 클래스란?

컬렉션 클래스(Collection Class)는 데이터를 저장하고 관리하는데 사용되는 특별한 자료구조입니다. 배열과 달리 동적으로 크기가 조정되며, 다양한 타입의 데이터를 효율적으로 관리할 수 있는 기능을 제공합니다. C#에서 대표적인 컬렉션 클래스는 List, Dictionary, Queue, Stack 등이 있습니다.

 

반응형

 

  2. 배열과 컬렉션 클래스의 차이점

C#의 배열(Array)은 고정된 크기의 데이터를 저장하는 데 사용되며, 배열이 생성된 후에는 크기를 변경할 수 없습니다. 반면에, 컬렉션 클래스는 데이터의 개수가 동적으로 변할 수 있어 데이터를 추가하거나 삭제할 때 매우 유연하게 대처할 수 있습니다.

// 배열 예시 int[] numbers = new int[5]; // 고정된 크기의 배열 // List 컬렉션 예시 List<int> dynamicNumbers = new List<int>(); // 동적으로 크기가 변하는 List dynamicNumbers.Add(1); dynamicNumbers.Add(2); dynamicNumbers.Add(3);

 

  3. 주요 컬렉션 클래스 소개

C#의 컬렉션 클래스는 크게 두 가지 제네릭(Generic) 컬렉션과 비제네릭(Non-generic) 컬렉션로 나눌 수 있습니다. 

 

제네릭 컬렉션(Generic Collection)

제네릭 컬렉션은 특정 데이터 타입에 제한되어 데이터를 처리할 수 있습니다. 코드의 안정성과 성능을 높여주며, 컴파일 시점에 타입을 명확하게 지정할 수 있습니다. 주요 제네릭 컬렉션 클래스는 다음과 같습니다.

  • List: 배열과 유사하지만, 크기를 동적으로 조절할 수 있는 리스트입니다.
  • Dictionary<TKey, TValue>: 키와 값의 쌍으로 데이터를 관리하는 해시 테이블 기반 컬렉션입니다.
  • Queue: FIFO(First In First Out) 방식으로 데이터를 관리하는 컬렉션입니다.
  • Stack: LIFO(Last In First Out) 방식으로 데이터를 관리하는 컬렉션입니다.

 

 

비제네릭 컬렉션(Non-generic Collection)

비제네릭 컬렉션은 모든 데이터 타입을 허용하지만, 타입 안전성이 떨어질 수 있습니다. 주로 예전 코드에서 사용되었으나, 현재는 제네릭 컬렉션이 더 권장됩니다.

 

  4. List 클래스

List는 가장 자주 사용되는 제네릭 컬렉션 클래스 중 하나로, 배열처럼 데이터의 순서가 중요할 때 사용됩니다. 하지만 배열과는 달리 크기를 동적으로 변경할 수 있어 데이터를 자유롭게 추가하거나 삭제할 수 있습니다.

 

사용법

List<string> names = new List<string>(); // 데이터 추가 names.Add("Alice"); names.Add("Bob"); // 데이터 접근 Console.WriteLine(names[0]); // Alice // 데이터 삭제 names.Remove("Bob");

 

주요 메서드

  • Add(T item): 데이터를 리스트에 추가합니다. 
  • Remove(T item): 리스트에서 해당 데이터를 제거합니다. 
  • Count: 리스트에 저장된 데이터의 개수를 반환합니다.

 

 

  5. Dictionary<TKey, TValue> 클래스

Dictionary <TKey, TValue>는 키-값 쌍으로 데이터를 관리하는 컬렉션입니다. 여기서 TKey는 고유한 키를 의미하고, TValue는 해당 키에 연관된 값을 나타냅니다.

 

사용법

// Dictionary 선언 Dictionary<int, string> students = new Dictionary<int, string>(); // 데이터 추가 students.Add(1, "Alice"); students.Add(2, "Bob"); // 데이터 접근 Console.WriteLine(students[1]); // Alice // 데이터 삭제 students.Remove(2);

 

주요 메서드

  • Add(TKey key, TValue value): 새로운 키-값 쌍을 추가합니다.
  • Remove(TKey key): 해당 키에 해당하는 데이터를 삭제합니다.
  • ContainsKey(TKey key): 특정 키가 Dictionary에 있는지 확인합니다.

 

  6. Queue 클래스

Queue는 FIFO(First In, First Out) 방식으로 데이터를 처리합니다. 즉, 먼저 들어온 데이터가 먼저 처리됩니다.

 

사용법

// Queue 선언 Queue<string> queue = new Queue<string>(); // 데이터 추가 queue.Enqueue("First"); queue.Enqueue("Second"); // 데이터 처리 Console.WriteLine(queue.Dequeue()); // First

 

주요 메서드 

  • Enqueue(T item): 큐에 데이터를 추가합니다.
  • Dequeue(): 큐에서 데이터를 제거하고 반환합니다.
  • Peek(): 큐에서 데이터를 제거하지 않고 반환합니다.

 

  7. Stack 클래스

Stack는 LIFO(Last In, First Out) 방식으로 데이터를 처리합니다. 즉, 나중에 들어온 데이터가 먼저 처리됩니다.

 

사용법

// Stack 선언 Stack<string> stack = new Stack<string>(); // 데이터 추가 stack.Push("First"); stack.Push("Second"); // 데이터 처리 Console.WriteLine(stack.Pop()); // Second

 

주요 메서드

  • Push(T item): 스택에 데이터를 추가합니다.
  • Pop(): 스택에서 데이터를 제거하고 반환합니다.
  • Peek(): 스택에서 데이터를 제거하지 않고 반환합니다.

 

 

  8. 컬렉션 클래스 사용 시 유의점

  • 타입 안전성: 제네릭 컬렉션을 사용할 때는 타입이 명확하기 때문에 타입 안정성이 높습니다. 반면, 비제네릭 컬렉션은 다양한 타입을 저장할 수 있지만, 그만큼 타입 오류가 발생할 확률이 높습니다.
  • 성능: 컬렉션 클래스는 데이터 추가와 삭제 시 유연성을 제공하지만, 너무 큰 데이터를 다루거나 빈번한 연산이 일어나는 경우 성능에 영향을 줄 수 있습니다. 이때는 적절한 컬렉션 클래스를 선택하는 것이 중요합니다.
  • 메모리 관리: 컬렉션 클래스는 동적으로 크기가 변하기 때문에 메모리 관리가 자동으로 이루어지지만, 불필요한 데이터를 적시에 삭제하지 않으면 메모리 누수가 발생할 수 있습니다.
반응형