C# 문법 종합반
C# 문법 종합반 / 2주차 / 컬렉션 / 배열과 리스트의 차이점
도도9999
2023. 8. 25. 15:57
컬렉션 : 자료를 모아 놓은 데이터 구조를 의미한다.
- 배열과 비슷한 자료 구조.
- 배열과는 다르게 크기가 가변적.
- C#에서는 다양한 컬렉션을 제공.
- 사용하기 위해서는 // System.Collections.Generic // 네임스페이스를 추가해야 한다.
~ 컬렉션의 사용과 예시 ~
1) List
: 가변적인 크기를 갖는 배열.
: List를 생성할 때는 List에 담을 자료형을 지정해야 한다.
List<int> numbers = new List<int>(); // 빈 리스트 생성, int 자료형 지정
numbers.Add(1); // 1~3 데이터 추가
numbers.Add(2);
numbers.Add(3);
numbers.Remove(2); // 2 데이터 삭제
foreach(int number in numbers) // 데이터 출력
{
Console.WriteLine(number);
}
// 혹은, for 문 활용 방법으로 출력하기
for (int i = 0; i < numbers.Count; i++)
{
Console.WriteLine(numbers[i]);
}
-> 1, 3만 콘솔에 출력됨
2) Dictionary
: 키와 값으로 구성된 데이터를 저장
: 중복된 키를 가질 수 없으며, 키와 값의 쌍을 이루어 데이터를 저장.
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 + ": " + pairValue);
}
Alice | 100 |
Bob | 80 |
Charlie | 90 |
와 같은 구조로 저장.
3) Stack
: 후입 선출 구조로 저장
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<int> queue1 = new Queue<int>(); // int형 Queue 선언
// Queue에 요소 추가
queue1.Enqueue(1);
queue1.Enqueue(2);
queue1.Enqueue(3);
// Queue에서 요소 가져오기
int value = queue1.Dequeue(); // value = 1 (가장 먼저 추가된 요소)
5) HashSet
: 중복되지 않 요소들로 이루어진 집
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);
}
2. 배열과 리스트의 차이점은?
: 리스트는 동적으로 크기를 조정하여, 유연한 데이터 구조를 구현한다.
: 다만 무분별하게 리스트를 사용하는 건 좋지 않다.
- 메모리 사용량 증가 : 동적으로 크기를 조정하기에, 더 많은 메모리를 사용한다. -> 성능 저하 유발
- 데이터 접근 시간 증가 : 연결 리스트로 구현되어, 데이터를 찾기 위해 연결 노드를 모두 순회한다.
- 코드 복잡도 증가 : 데이터 추가, 삭제가 간편하지만! 데이터 추가, 삭제 작업을 처리하는 코드를 추가해야 하므로 코드의 가독성과 유지보수성이 오히려 저하됨.