C#에는 배열, 리스트, 스택, 큐, 링크드리스트, 해시맵, 해시셋의 자료구조를 제공한다.
각 사용 용도가 다른데 사용 예시는 다음과 같다.
자료구조 | 주요 특징 | 사용 예시 |
---|---|---|
배열 | 고정 크기, 빠른 접근 | 고정 크기의 데이터 처리 |
리스트 | 가변 크기, 삽입/삭제 가능 | 동적 데이터 관리 |
스택 | LIFO 구조 | 재귀, 괄호 검사, DFS |
큐 | FIFO 구조 | 작업 대기열, BFS |
LinkedList | 빠른 삽입/삭제 | 빈번한 삽입/삭제 작업 |
Dictionary | 키-값 쌍 관리, 빠른 검색 | 해시 테이블 구현 |
HashSet | 중복 없는 데이터 저장 | 집합 연산 (교집합, 합집합 등) |
배열은 크기가 고정되어 있으며 동일한 데이터 타입의 요소를 저장하고 크기를 선언시에 지정하게 되면 변경이 불가하다.
빠른 인덱스 접근이 가능하고 메모리 효율적이나 유연성이 부족하고 요소 추가,삭제가 비효율적이다.
int[] numbers = { 1, 2, 3, 4, 5 };
Console.WriteLine(numbers[0]);
리스트는 크기가 가변적이며 내부적으로 배열 기반이고 크기가 초과되면 새로운 배열로 복사한다. 데이터 추가,삭제가 용이하다.
List<int> numbers = new List<int> {1,2,3};
numbers.Add(4);
numbers.Remove(1);
링크드리스트는 노드가 데이터와 다음 노드의 참조를 가진 형태로 삽입/삭제가 빠르다. 중간 삽입, 삭제가 배열이나 리스트보다 빠르나 접근이 느리다는 단점이 있다.
LinkedList<int> linkedList = new LinkedList<int>();
linkedList.AddLast(1); // 1
linkedList.AddLast(2); // 1,2
linkedList.AddFirst(3); // 3,1,2
LinkedListNode<int> node = linkedList.Find(1);
linkedList.AddBefore(node,7) // 3,7,1,2
메서드 요약표
메서드 | 설명 | 반환값 |
---|---|---|
AddFirst | 맨 앞에 요소 추가 | 추가된 노드 |
AddLast | 맨 뒤에 요소 추가 | 추가된 노드 |
AddBefore | 지정된 노드 앞에 요소 추가 | 추가된 노드 |
AddAfter | 지정된 노드 뒤에 요소 추가 | 추가된 노드 |
Find | 특정 값을 가진 첫 번째 노드 반환 | LinkedListNode<T> |
Remove | 특정 값을 가진 노드 제거 | true /false |
RemoveFirst | 첫 번째 노드 제거 | 없음 |
RemoveLast | 마지막 노드 제거 | 없음 |
스택은 LIFO 형 자료구조이며 마지막 추가된 요소가 먼저 제거된다. DFS, 괄호검사 등에 적합하며 구현이 간단하다.
Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
stack.Pop(); // 2 가 제거되며 2를 반환함
stack.Peek(); // 1이 제거되지 않고 1을 반환함
큐는 FIFO 형 자료구조이고 먼저 추가된 요소가 먼저 제거된다. 이 친구는 스택과 달리 Enqueue
, Dequeue
로 작동한다.
순서가 중요한 패킷 처리나 작업대기열, BFS등에 적합하다.
Queue<int> queue = new Queue<int>();
queue.Enqueue(1);
queue.Enqueue(2);
queue.Dequeue(); // 1이 제거되며 1을 반환함
queue.Peek(); // 2가 제거되지 않고 2를 반환함
해시맵은 딕셔너리형으로 키-값 쌍으로 데이터를 저장한다. js에서 객체와 같이 사용된다.
Dictionary<string,int> dict = new Dictionary<string, int>();
dict["kong"] = 2;
dict["kongkong"] = 22;
Console.WriteLine(dict["kong"]); // 2
해시셋은 중복을 허용하지 않는 집합 자료구조로 js에서 Set과 같은 역할을 한다.
HashSet<int> set = new HashSet<int> { 1, 2, 3 };
set.Add(3); // 중복 추가 불가, False를 반환함