using System.ComponentModel;
using System.Numerics;
using System.Threading;
using System.Collections.Generic;
namespace CSharp
{
class Program
{
static void Main(string[] args)
{
// List
// 데이터가 많아지면 동적으로 변경이 불가능하다.
// 따라서 새로운 형태
// 데이터가 커짐에 따라 크기가 유동적으로 변함
// List <- 동적 배열
List<int> list = new List<int>();
//List<float> listFloat;
// <> 안에 타입을 넣어준다.
// 생성을 바로 했을 경우는 빈 상태
// 바로 접근하면 OutofRange 에러 발생
// 리스트가 한 개이상 있어야 실행됨
// Add : 맨 뒤에 추가
for (int i = 0; i < 5; i++)
{
list.Add(i);
}
// List 출력
for (int i = 0; i<5; i++)
{
Console.WriteLine(list[i]);
}
// foreach 사용
foreach (int num in list)
{
Console.WriteLine(num);
}
// 삽입 : 중간 삽입
list.Insert(2, 999);
for (int i = 0; i < list.Count; i++)
{
list.Add(i);
}
foreach (int num in list)
{
Console.WriteLine(num);
}
// 삭제
bool success = list.Remove(3); // 검색해서 맨 처음 3을 삭제함
list.RemoveAt(0); // 인덱스로 삭제
list.Clear(); // 전체 삭제
// 항상 복사가 일어나서 삽입 삭제가 효율적이지 않음
}
}
}
✅ List<T>는 동적 배열이다.
✅ 배열처럼 연속된 메모리를 사용하지만, 크기가 자동으로 늘어나며 관리된다.
✅ 내부적으로는 배열을 감싼 래퍼 클래스로, 데이터가 가득 차면 더 큰 배열로 복사하여 확장하는 구조.
✅ C++의 vector와 거의 동일한 개념
using System.Collections.Generic;
List<T>는 System.Collections.Generic에 포함List<int> list = new List<int>();
| 키워드 | 설명 |
|---|---|
| List | 정수형 동적 배열 선언 |
| new List() | 실제 메모리 할당 (힙 영역에 생성) |
list.Add(1);
1 추가list.Insert(2, 999);
2 위치에 값 999 삽입list.Remove(3);
3인 원소를 찾아 삭제true 반환, 없으면 falselist.RemoveAt(0);
0의 원소 삭제list.Clear();
Console.WriteLine(list.Count);
| 구분 | 배열 (Array) | List |
|---|---|---|
| 크기 | 고정 | 가변 (자동 확장) |
| 선언 | int[] arr | List<int> |
| 메모리 | 연속된 메모리 | 연속된 메모리 (내부적으로 배열 기반) |
| 요소 접근 | 빠름 (O(1)) | 빠름 (O(1)) |
| 삽입 삭제 | 비효율적 | 끝 삽입만 효율적, 중간 삽입/삭제는 비효율적 |
| 공간 관리 | 직접 | 자동 관리 |
⚠️ 평균적으로는 빠르지만, 특정 시점에서 큰 비용 발생 (재할당 + 복사)