c# 컬렉션(List, Dictionary(딕셔너리), Stack(후입선출), Queue(선입선출), HashSet) 배열과 리스트 차이점
개요
컬렉션에 대해서 알아보겠습니다
내용 - 컬렉션이란?
컬렉션(Collection)은 자료를 모아 놓은 데이터 구조를 의미
- 컬렉션은 배열과 비슷한 자료 구조
- 배열과는 다르게 크기가 가변적
- C#에서는 다양한 종류의 컬렉션을 제공
- 사용하기 위해서는 System.Collections.Generic 네임스페이스를 추가
내용 - 컬렉션 예시 1. List
- List는 가변적인 크기를 갖는 배열
- List를 생성할 때는 List에 담을 자료형을 지정
코드
List<int> numbers = new List<int>(); // 빈 리스트 생성
numbers.Add(1); // 리스트에 데이터 추가
numbers.Add(2);
numbers.Add(3);
numbers.Remove(2); // 리스트안에 있는 내용이 2이면 데이터 삭제
numbers.RemoveAt(0) // 리스트 안에 0번째에 있는 내용 삭제
for(int i = 0; i < list.Count; i++) //list에는 Count로 사용된다.
{
Console.WriteLine(list[i]); //list도 대괄호를 이용해서 인덱싱이 가능하다
}
foreach(int number in numbers) // 리스트 데이터 출력
{
Console.WriteLine(number);
}
내용 - 2. 딕셔너리(Dictionary)
- 딕셔너리(Dictionary)는 키와 값으로 구성된 데이터를 저장
- 딕셔너리는 중복된 키를 가질 수 없으며, 키와 값의 쌍을 이루어 데이터를 저장
- 딕셔너리 사용할때 foreach를 많이 사용함
딕셔너리 : 인덱스 형식으로 사용하면 안됨 키값으로 사용해야됨
If (items2.ContainsKey(1) == false) 혹은 if (!items2.ContainsKey(1) 라고도 표현가능
{
items2.Add(1, “모자”);
}
딕셔너리 사용할때 foreact사용하면 좋음
foreach(KeyValuePair<int, string> item2)
{
Debug.Log($”key:{item.Key} vale:{item.Value}”}; 이렇게 사용 가능
}
코드
using System.Collections.Generic;
Dictionary<string, int> scores = new Dictionary<string, int>(); // 빈 딕셔너리 생성
scores.Add("Alice", 100); // 딕셔너리에 데이터 추가
scores.Add("Bob", 80);
scores.Add("Charlie", 90);
scores.Remove("Bob"); // 딕셔너리에서 데이터 삭제
foreach(KeyValuePair<string, int> pair in scores) // 딕셔너리 데이터 출력 //
{
Console.WriteLine(pair.Key + ": " + pair.Value);
}
설명
foreach를 사용할떄 KeyValuePair를 사용하는 이유는 키 값과 밸류값을 줘야되서 작성한 거다.
그래서 Console.WriteLine에서 키값과 밸류값을 따로따로 출력하고 있는거다.
내용 - 3. Stack
Stack은 후입선출(LIFO) 구조를 가진 자료 구조
바구니라고 생각하면 편하다.
코드
Stack<int> stack1 = new Stack<int>(); // int형 Stack 선언
// Stack에 요소 추가
stack1.Push(1);
stack1.Push(2);
stack1.Push(3);
// Stack에서 요소 가져오기
int value = stack1.Pop(); // value = 3 (마지막에 추가된 요소)
내용 - 4. Queue
Queue는 선입선출(FIFO) 구조를 가진 자료 구조
파이프라고 생각하면 편하다.
코드
Queue<int> queue1 = new Queue<int>(); // int형 Queue 선언
// Queue에 요소 추가
queue1.Enqueue(1);
queue1.Enqueue(2);
queue1.Enqueue(3);
// Queue에서 요소 가져오기
int value = queue1.Dequeue(); // value = 1 (가장 먼저 추가된 요소)
내용 - 4. HashSet
HashSet은 중복되지 않은 요소들로 이루어진 집합
list와 비슷한 형태이다.
코드
HashSet<int> set1 = new HashSet<int>(); // int형 HashSet 선언
// HashSet에 요소 추가
set1.Add(1);
set1.Add(2);
set1.Add(3);
// HashSet에서 요소 가져오기
foreach (int element in set1)
{
Console.WriteLine(element);
}
내용 - 배열과 리스트 차이점
리스트는 동적으로 크기를 조정할 수 있어 배열과는 다르게 유연한 데이터 구조를 구현할 수 있습니다. 하지만, 리스트를 무분별하게 사용하는 것은 좋지 않은 습관입니다.
- 메모리 사용량 증가: 리스트는 동적으로 크기를 조정할 수 있어 배열보다 많은 메모리를 사용합니다. 따라서, 많은 데이터를 다루는 경우 리스트를 무분별하게 사용하면 메모리 사용량이 급격히 증가하여 성능 저하를 유발할 수 있습니다.
- 데이터 접근 시간 증가: 리스트는 연결 리스트(linked list)로 구현되기 때문에, 인덱스를 이용한 데이터 접근이 배열보다 느립니다. 리스트에서 특정 인덱스의 데이터를 찾기 위해서는 연결된 노드를 모두 순회해야 하기 때문입니다. 이러한 이유로, 리스트를 무분별하게 사용하면 데이터 접근 시간이 증가하여 성능이 저하될 수 있습니다.
- 코드 복잡도 증가: 리스트는 동적으로 크기를 조정할 수 있기 때문에, 데이터 추가, 삭제 등의 작업이 배열보다 간편합니다. 하지만, 이러한 유연성은 코드 복잡도를 증가시킬 수 있습니다. 리스트를 사용할 때는 데이터 추가, 삭제 등의 작업을 적절히 처리하는 코드를 작성해야 하므로, 코드의 가독성과 유지보수성이 저하될 수 있습니다.
따라서, 리스트를 무분별하게 사용하는 것은 좋지 않은 습관입니다. 데이터 구조를 선택할 때는, 데이터의 크기와 사용 목적을 고려하여 배열과 리스트 중 적절한 것을 선택해야 합니다.