dev/asp.net, c#

[C#] 컬렉션(Collection) - System.Collections, 제너릭(List, Dictionary, Queue, Stack, SortedList)

코딩for 2022. 11. 9. 16:24
반응형

C# 컬렉션

배열은 고정된 갯수의 개체를 만들고 사용을 하지만,

컬렉션은 배열과는 달리 데이터의 추가 및 삭제등으로 변경됨에 따라 개체가 동적으로 확장되거나 축소될 수 있습니다.

 

 

C# 컬렉션 클래스의 유형

c#은 3개의 다양한 컬렉션을 제공하며 각 클래스에 대해 알아봅니다.

  1. System.Collections.Generic
  2. System.Collections
  3. System.Collections.Concurrent

 

System.Collections.Generic 클래스

System.Collections.Generic 네임스페이스의 클래스 중 하나를 사용하여 제네릭 컬렉션을 만들 수 있습니다. 제네릭 컬렉션은 컬렉션의 모든 항목에 동일한 데이터 형식이 있는 경우에 유용합니다. 제네릭 컬렉션은 원하는 데이터 형식만 추가할 수 있도록 하여 강력한 형식 지정을 적용합니다.

Dictionary, List, Queue, Stack, SortedList

 

■  기본 사용법

List<T>
인덱스를 사용하여 액세스할 수 있는 동일한 데이터 유형List 의 여러 요소를 저장하는 데 사용됩니다 . 목록 내부에 요소를 추가, 삽입 및 제거할 수 있습니다. 또한 목록의 크기를 동적으로 변경할 수 있습니다.

using System;
using System.Collections.Generic;

// LIST
IList<string> list = new List<string>();
list.Add("cat");
list.Add("dog");

Console.WriteLine($"Access List Elements : {list[0]}");
// (index=0) 에 fish 를 추가
list.Insert(0, "fish");

foreach (var item in list)
{
    Console.WriteLine($"Iterate the List item : {item}");
}​

 

Dictionary<TKey, TValue>
키에 따라 구성된 키/값 쌍의 컬렉션을 나타냅니다.

using System;
using System.Collections.Generic;

IDictionary<int, string> dic = new Dictionary<int, string>();
dic.Add(1,"cat");
dic.Add(2,"dog");

dic[2] = "snake";   // value 값 변경
dic.Remove(1);      // 키 값 삭제

if (dic.ContainsKey(2))     // 키가 있는지 확인
{
	Console.WriteLine("Dictionary Key is already added..");
}

foreach (var item in dic)
{
	Console.WriteLine($"Iterate the Dictionary : {item.Key}-{item.Value}");
}​
Queue<T>
FIFO(선입 선출) 방식으로 저장됩니다. 여기서 요소는 한쪽 끝에서 삽입되고 다른 쪽 끝에서 제거됩니다.

using System;
using System.Linq;
using System.Collections.Generic;

Queue<string> queue = new Queue<string>();
queue.Enqueue("cat" );
queue.Enqueue("dog" );
queue.Enqueue("fish" );

foreach (var item in queue)
{
    Console.WriteLine($"Iterate the Queue : {item}");
}

Console.WriteLine($"Dequeue the Queue : {queue.Dequeue()}, Queue Cnt:{queue.Count()}");  // queue 에서 하나 제거
Console.WriteLine($"Peek the Queue : {queue.Peek()}, Queue Cnt:{queue.Count()}");       // peek 데이터만 조회
foreach (var item in queue)
{
    Console.WriteLine($"Iterate the Queue Dequeue: {item}");
}
Stack<T>
LIFO(Last In First Out) 방식으로 저장됩니다.

using System;
using System.Linq;
using System.Collections.Generic;

Stack<string> stack = new Stack<string>();
stack.Push("cat" );
stack.Push("dog" );
stack.Push("fish" );

foreach (var item in stack)
{
    Console.WriteLine($"Iterate the Stack : {item}");
}

Console.WriteLine($"Pop the Stack : {stack.Pop()}, Queue Cnt:{stack.Count()}");     // stack 에서 하나 제거
Console.WriteLine($"Peek the Stack : {stack.Peek()}, Queue Cnt:{stack.Count()}");
foreach (var item in stack)
{
    Console.WriteLine($"Iterate the Stack Pop : {item}");
}​
SortedList<TKey, TValue>
연관된 IComparer 구현을 기반으로 키에 따라 정렬된 키/값 쌍의 컬렉션을 나타냅니다.

using System;
using System.Collections.Generic;

SortedList<string, string> sortList = new SortedList<string, string>();
sortList.Add("1", "cat" );
sortList.Add("2", "dog" );
sortList.Add("3", "fish" );

foreach (var item in sortList)
{
    Console.WriteLine($"Iterate the SortedList : {item.Key}-{item.Value}");
}

if (sortList.ContainsKey("2"))     // 키가 있는지 확인
{
    Console.WriteLine("Key is already added..");
}

sortList.Remove("2");   // key 값이  2 삭제

foreach (var item in sortList)
{
    Console.WriteLine($"Iterate the SortedList Remove : {item.Key}-{item.Value}");

}

 

 

 

System.Collections 클래스

System.Collections 네임스페이스의 클래스는 구체적 형식의 개체가 아니라 Object 형식의 개체로 요소를 저장합니다.

가능하면 항상 System.Collections.Generic 네임스페이스 또는 System.Collections.Concurrent 네임스페이스의 제네릭 컬렉션을 사용해야 합니다.

 

ArrayList 필요에 따라 크기가 동적으로 증가하는 개체 배열을 나타냅니다.
Hashtable 키의 해시 코드에 따라 구성된 키/값 쌍의 컬렉션을 나타냅니다.
Queue FIFO(선입선출) 방식의 개체 컬렉션을 나타냅니다.  
Stack LIFO(후입선출) 방식의 개체 컬렉션을 나타냅니다. 

* System.Collections 은 object 형식으로 저장되기 때문에(boxing, unboxing) 문제로 인한 성능 이슈가 발생을 하여 

아래와 같이 System.Collections.Generic 네임스페이스의 클래스를 사용 하도록 권장한다.

ArrayList              => List<T>
Hashtable            => Dictionary<Tkey, Tval>
Queue                 => Queue
Stack                   => Stack

 

 

 

System.Collections.Concurrent 클래스

.NET Framework 4 이상 버전에서 System.Collections.Concurrent 네임스페이스의 컬렉션은 여러 스레드에서 컬렉션 항목에 액세스하기 위한 효율적이고 스레드로부터 안전한 작업을 제공합니다.

  • BlockingCollection<T>
  • ConcurrentDictionary<TKey,TValue>
  • ConcurrentQueue<T>
  • ConcurrentStack<T>

- 관련 테스트 코드 작성후 등록 예정

 

 

 

*참고

https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/concepts/collections

https://www.programiz.com/csharp-programming/collections

 

반응형