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. 배열과 리스트의 차이점은?

: 리스트는 동적으로 크기를 조정하여, 유연한 데이터 구조를 구현한다.

: 다만 무분별하게 리스트를 사용하는 건 좋지 않다.

- 메모리 사용량 증가 : 동적으로 크기를 조정하기에, 더 많은 메모리를 사용한다. -> 성능 저하 유발

- 데이터 접근 시간 증가 : 연결 리스트로 구현되어, 데이터를 찾기 위해 연결 노드를 모두 순회한다.
- 코드 복잡도 증가 : 데이터 추가, 삭제가 간편하지만! 데이터 추가, 삭제 작업을 처리하는 코드를 추가해야 하므로 코드의 가독성과 유지보수성이 오히려 저하됨.