1. C# List란?
C#에서 List<T>는 제네릭 컬렉션으로, C++에서 동적으로 크기가 조절되는 Vector와 유사합니다. List<T>는 . Net의 ‘Systtem.Collections.Generic’ 네임스페이스에 속해 있으며, 다양한 데이터 타입을 저장하고 관리하는데 유용합니다.
2. 주요 특징
- 제네릭 타입: 리스트는 제네릭 타입으로, 특정 타입의 데이터를 저장할 수 있습니다. 타입 안전성을 제공하여 컴파일 시간에 타입 오류를 방지할 수 있습니다.
- 동적 크기 조정: 리스트는 내부적으로 배열을 사용하여 요소를 저장합니다. 리스트의 크기 조정은 다음과 같이 작동합니다.
1. 요소 추가 시 크기 조정: 리스트의 용량이 현재 요소의 수를 초과할 때, 새로운 요소를 추가하면 내부 배열의 크기가 두 배로 증가합니다. 이는 크기 조정을 통해 성능을 최적화하고, 요소 추가 작업이 자주 일어나도 전체적인 성능을 유지하기 위함입니다.
2. 요소 삭제 시 크기 조정: 리스트에서 요소를 제거해도 내부 배열의 크기는 자동으로 줄어들지 않습니다. 내부 배열의 크기는 그대로 유지되며, 빈 공간으로 남아 있게 됩니다. 필요하다면 ‘TrimExcess’ 메서드를 호출하여 실제 요소 수에 맞게 용량을 조절할 수 있습니다. - 인덱스 접근: 배열처럼 인덱스를 사용하여 리스트의 요소에 접근할 수 있습니다.
- 다양한 메서드 제공: 요소 추가, 제거, 검색, 정렬 등 다양한 작업을 수행할 수 있는 메서드를 제공합니다.
3. 주요 메서드
요소 추가
- Add(T item): 리스트의 끝에 요소를 추가합니다.
- AddRange(IEnumerable<T> collection): 컬렉션의 모든 요소를 리스트에 추가합니다.
요소 제거
- Remove(T item): 특정 요소를 리스트에서 제거합니다.
- RemoveAt(int index): 지정된 인덱서의 요소를 제거합니다.
- Clear(): 리스트의 모든 요소를 제거합니다.
요소 검색
- Contains(T item): 리스트에 특정 요소가 있는지 확인합니다.
- IndexOf(T item): 특정 요소의 인덱스를 반환합니다.
- Find(Predicate<T> match): 조건에 맞는 첫 번째 요소를 반환합니다.
정렬 및 기타
- Sort(): 리스트의 요소를 정렬합니다.
- Reverse(): 리스트의 요소 순서를 반전시킵니다.
예제 코드
리스트 생성 및 초기화
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 리스트 생성
List<int> numbers = new List<int>();
// 요소 추가
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
// 여러 요소 추가
numbers.AddRange(new int[] { 4, 5, 6 });
// 요소 출력
foreach (int number in numbers)
{
Console.WriteLine(number);
}
}
}
요소 검색 및 제거
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<string> fruits = new List<string> { "Apple", "Banana", "Cherry", "Date" };
// 요소 검색
if (fruits.Contains("Banana"))
{
Console.WriteLine("Banana is in the list.");
}
// 특정 요소 제거
fruits.Remove("Cherry");
// 인덱스로 요소 제거
fruits.RemoveAt(2);
// 리스트 요소 출력
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}
}
}
4. 시간 복잡도
- 접근(인덱스): O(1) - 배열처럼 리스트의 특정 인덱스에 직접 접근할 수 있습니다.
- 추가(끝에 추가): 평균적으로 O(1) - 리스트의 용량이 충분할 때는 O(1)입니다. 용량이 부족하여 크기를 조정할 때는 O(n)이지만, 이는 자주 발생하지 않으므로 평균적으로 O(1)로 알아두시면 됩니다.
- 추가(중간에 추가): O(n) - 삽입 위치 이후의 요소들을 이동시켜야 하기 때문에 O(n)입니다.
- 제거(끝에서 제거): O(1) - 리스트의 끝에서 요소를 제거할 때 다른 요소들을 이동시킬 필요 없이단순히 마지막 요소를 제거하면 되기에 상수 시간 내에 작업이 완료됩니다.
- 제거(중간에서 제거): O(n) - 제거된 요소 이후의 요소들을 이동시켜야 하기 때문에 O(n)입니다.
- 검색(Contains, IndexOf 등): O(n) - 리스트의 요소를 순차적으로 검색해야 하므로 O(n)입니다.
5. C++ Vector의 특징 및 List와 차이점
C++의 std::vector와 C#의 List<T>는 둘 다 동적 배열을 제공하는 데이터 구조로, 많은 공톰정을 가지고 있지만, 언어 특성 및 구현 방식에 따라 차이점이 존재합니다. 아래에서는 std::vector의 특징과 List<T>와의 차이점을 설명하겠습니다.
C++ 벡터(std::vector)의 특징
동적 크기 조정: 벡터는 요소가 추가되면 크기가 동적으로 증가합니다. 기본적으로 크기가 두 배로 증가합니다.
연속된 메모리 저장: 벡터의 요소는 연속된 메모리 블록에 저장되며, 이를 통해 빠른 인덱스 접근을 제공합니다.
성능 최적화: 메모리 할당 및 해제에 최적화되어 있으며, 필요에 따라 메모리 할당을 줄이기 위해 할당 전략을 사용자 정의할 수 있습니다.
메모리 관리: C++에서는 벡터의 메모리 관리를 직접 제어할 수 있습니다. 벡터의 capacity와 size를 다루는 다양한 메서드를 제공합니다.
템플릿 클래스: std::vector는 템플릿 클래스로, 어떤 데이터 타입도 저장할 수 있습니다.
C++ 벡터와 C# 리스트의 차이점
1. 언어와 라이브러리
- C++ 벡터(std::vector)
- C++ 표준 템플릿 라이브러리(STL)의 일부입니다.
- #include<vector>헤더 파일을 통해 사용합니다.
- C# 리스트(List<T>)
- .NET의 System.Collections.Generic 네임스페이스에 포함됩니다.
- using System.Collections.Generic을 통해 사용합니다.
2. 메모리 관리
- C++ 벡터(std::vector)
- 직접 메모리 관리를 통해 높은 성능 최적화를 달성할 수 있습니다.
- 벡터의 메모리 할당, 해제, 크기 조정을 세밀하게 제어할 수 있습니다.
- reserve 메서드를 사용하여 미리 메모리를 할당할 수 있습니다.
- C# 리스트(List<T>)
- 가비지 컬렉션을 통해 메모리 관리를 자동으로 처리합니다.
- 리스트의 크기 조정은 자동으로 이루어지며, 사용자는 메모리 관리를 신경 쓸 필요가 없습니다.
3. 성능
- C++ 벡터(std::vector)
- 성능 최적화가 필요할 때 유용하며, 메모리 관리 및 할당 전략을 조정할 수 있습니다.
- 인덱스 접근, 추가 및 삭제가 빠르지만, 중간에 요소를 삽입하거나 제거할 때는 성능 저하가 발생할 수 있습니다.
- C# 리스트(List<T>)
- 편의성과 생산성에 중점을 두며, 성능은 가비지 컬렉션에 의해 관리됩니다.
- 인덱스 접근, 끝에서 추가 및 삭제가 빠릅니다. 중간 삽입 및 제거 시에도 벡터와 유사한 성능 저하가 발생합니다.
4. 기타 기능
- C++ 벡터(std::vector)
- 메모리 최적화를 위해 벡터의 용량을 직접 제어할 수 있는 다양한 메서드(reserve, shrink_to_fit 등)를 제공합니다.
- 벡터는 복사, 이동 연산자를 지원하며 효율적인 객체 이동이 가능합니다.
- C# 리스트(List<T>)
- LINQ(Language Integrated Query)를 통해 데이터 조작이 편리합니다.
- 리스트는 다양한 유틸리티 메서드(Find, FindAll, ConvertAll 등)를 제공하여 데이터 처리가 용이합니다.
지금까지 C# List에 대해 자세히 알아보았습니다.
현재 글의 내용 중 틀린 부분이나, 지적하실 내용이 있으시다면 언제든지 알려주세요! 읽어주셔서 감사합니다.
'CS 공부' 카테고리의 다른 글
[C#] 해시셋 (HashSet) (0) | 2024.06.28 |
---|---|
[C#] 링크드 리스트 (Linked List) (0) | 2024.06.23 |
[C#] 딕셔너리 (Dictionary) (0) | 2024.06.21 |
[C#] 자료구조와 컬렉션 (2) | 2024.06.11 |
CS 지식 강의 요약 정리본 1 (메모리, 대리자, 람다식) (0) | 2024.05.27 |