C#) 배열, 컬렉션 (C++ vector와의 비교)
배열은 타 언어에서도 상당히 많이 사용하고 중요했다.
그런데 파이썬 리스트와 C++ std::vector와는 배열의 개념이 조금 다른 것 같다.
배열
배열이란 동일한 자료형의 값들이 연속적으로 저장된 자료구조이다.
1차원 배열
- 동일한 데이터 유형의 요소들을 한 번에 모아서 다룰 수 있는 구조
- 인덱스를 사용해 요소에 접근 가능하다.
- 초기화 시 입력한 크기만큼 메모리를 할당 받는다.
// 크기가 10인 int 배열 선언
int[] arr = new int[10];
// 크기가 5인 string 배열 선언
string[] arrS = new string[5];
다차원 배열
- 여러 개의 배열을 하나로 묶은 배열.
- 행과 열로 생각 가능하다.
- C#에서는 다차원 배열 선언 시 각 차원의 크기를 지정해야 한다.
// 2차원 배열의 선언과 초기화
int[,] array3 = new int[2, 3]; // 2행 3열의 int형 2차원 배열 선언
// 선언과 함께 초기화
int[,] array2D = new int[3, 4] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
C++ vector와 C# 배열의 비교
유사점
- 데이터 집합 관리
- 둘 다 여러 개의 값을 저장하는 데 사용.
- 데이터의 순서를 유지하며 인덱스를 통해 개별 요소에 접근 가능.
- 0부터 시작하는 인덱스
- C++의
vector와 C#의 배열 모두 0부터 시작하는 인덱스를 사용하여 데이터를 참조.
- C++의
- 데이터 타입
- 두 자료구조 모두 특정 데이터 타입의 요소만 저장할 수 있다.
예)
std::vector<int>는int만,int[]도int만 저장.
- 두 자료구조 모두 특정 데이터 타입의 요소만 저장할 수 있다.
예)
차이점
1. 크기 변경 가능 여부
-
C++
std::vector:- 크기가 동적으로 변할 수 있다.
- 요소를 추가(
push_back)하거나 제거(pop_back)할 수 있다.
-
C# 배열 (
Array):- 크기가 고정되어 있습니다. 생성 시 지정한 크기를 변경할 수 없습니다.
- 크기를 변경하려면 새로운 배열을 생성해야 합니다.
이렇게 직접 비교해보니, 오히려 vector는 컬렉션의 List와 비슷한 것 같다.
컬렉션(Collection)
- 컬렉션은 자료를 모아 놓은 데이터 구조를 뜻한다.
- 배열과 비슷한 자료 구조
- C#은 다양한 컬렉션 제공
- 사용하기 위해서,
System.Collections.Generic네임 스페이스를 추가해야 한다.
List
- List는 가변적인 크기를 갖는 배열
- 초기화 시, 자료형을 지정해야한다.
List<int> numbers = new List<int>(); // 빈 리스트 생성
numbers.Add(1); // 리스트에 데이터 추가
numbers.Add(2);
numbers.Add(3);
numbers.Remove(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 + ": " + pair.Value);
}
Stack
- 후입선출형 자료 구조
Queue
- 선입선출형 자료 구조
C++ std::vector와 C# List<T> 비교
유사점
동적 크기 조정 지원
- 두 자료구조 모두 내부적으로 동적 배열로 구현되어 있고, 크기를 자동으로 조정할 수 있다.
- 추가(
push_back/Add)하거나 제거(pop_back/Remove)할 수 있다.
0부터 시작하는 인덱스 기반 접근
- 두 자료구조 모두 배열처럼 인덱스를 통해 요소에 접근할 수 있다.
std::vector<int> vec = {1, 2, 3};
std::cout << vec[0];
// 출력: 1
List<int> list = new List<int> {1, 2, 3};
Console.WriteLine(list[0]);
// 출력: 1
임의 접근 가능 (Random Access)
- 두 자료구조 모두 요소를 인덱스를 통해 즉시 접근할 수 있다.
유틸리티 메서드 제공
- 두 자료구조는 요소 추가, 제거, 검색, 크기 조정 등의 메서드를 제공.
동일한 데이터 타입만 저장
- 둘 다 특정 데이터 타입만 저장하며, 제네릭(
template/generic)으로 구현.
차이점
메서드 이름
C++ std::vector:
- 요소 추가:
push_back(value) - 요소 제거:
pop_back() - 크기 확인:
size() - 요소 삭제:
erase(iterator) - 초기화:
assign(count, value)
C# List<T>:
- 요소 추가:
Add(value) - 요소 제거:
Remove(value)/RemoveAt(index) - 크기 확인:
Count(속성) - 요소 삭제:
RemoveAt(index) - 초기화:
AddRange(IEnumerable<T>)
결론
- C++의
std::vector와 C#의List<T>는 기능적으로 매우 유사하다. - 둘 다 동적 배열로 동작하며, 요소 추가/삭제, 크기 조정, 임의 접근 등의 작업이 가능하다.
- C#은 가비지 컬렉터 덕분에 메모리 관리가 더 간편하다.
- C++의
std::vector는 더 세밀한 메모리 관리와 성능 조정이 가능하다.
댓글남기기