C#
C# - List vs Array(리스트 vs 배열)
Dev_Jen
2025. 7. 4. 10:26
반응형
✅ 리스트(List) vs 배열(Array) 핵심 차이 요약
항목 | 배열 (int[]) | 리스트 (List<int>) |
크기 | 고정 (정적) | 가변 (동적) |
타입 | 기본 자료형 (int[]) | 제네릭 클래스 (List<T>) |
기능 | 제한적 (Add 불가) | 다양한 메서드 제공 (Add, Remove 등) |
성능 | 빠름 (오버헤드 적음) | 약간의 오버헤드 있음 (성능 ↓) |
저장 위치 | 힙 (※참조 타입) | 힙 (내부 배열도 힙) |
📌 중요! 배열도 참조 타입이기 때문에 스택이 아닌 힙에 저장됨!
❗ 오해 주의: "배열은 스택에 저장된다?" → ❌
✳️ C#에서 배열은 참조 타입이야
int[] arr = new int[3]; // 힙에 배열 생성
- arr라는 참조 변수는 스택에 존재하지만,
- 실제 int[3] 배열 데이터는 힙에 저장됨
📌 이건 List<int>도 마찬가지야. 내부에 int[]를 가지고 있고, 이 int[]도 힙에 있어.
✅ 메모리 구조 비교
1️⃣ int[] arr = new int[3];
stack:
└─ arr (→ 힙 주소)
heap:
└─ [0, 0, 0] ← 실제 배열
2️⃣ List<int> list = new List<int>();
stack:
└─ list (→ 힙 주소)
heap:
└─ List 객체
└─ 내부에 int[] 배열 (다시 힙에 있음)
즉, 둘 다 힙에 저장되며, List는 배열을 내부에 포함한 추가적인 클래스 구조야.
✅ 기능 차이 정리
배열
int[] arr = new int[3];
arr[0] = 1;
// arr.Add(1); ❌ 불가능
리스트
List<int> list = new List<int>();
list.Add(1); // ✅ 동적으로 크기 증가
list.Remove(1); // ✅ 삭제도 가능
✅ 성능 차이
- 배열은 기능이 단순해서 메모리 할당, 접근 속도 모두 빠름
- 리스트는 내부적으로 배열을 사용하지만, Add 시 크기 초과하면 배열을 재할당해야 하므로 오버헤드 발생
예: Add() → 배열 크기 부족 → 더 큰 배열 만들어 복사 → 기존 배열은 GC 대상
✅ 결론
항목 | 정리 |
저장 위치 | 배열도 리스트도 실제 데이터는 힙에 저장됨 |
크기 | 배열은 고정, 리스트는 가변 |
기능 | 배열은 단순, 리스트는 편리한 기능 많음 |
메모리 구조 | 리스트는 배열을 감싸는 클래스 형태의 구조 |
성능 | 배열이 더 빠르지만 유연성은 리스트가 더 좋음 |
✅
흠..기본적인 간단한 구조라면 배열을 사용하고 그렇지않고 가변적으로 계속 사용해야 할때는 리스트가 확실히 나을듯 하네요!
그리고 개인적으로 든 생각은 정적인것은 스택, 동적인건 힙인줄 알고있었고
그래서 배열은 정적이니까 스택에 들어가고 리스트가 힙에 들어갈 줄 알았는데 둘다 힙에 들어간다니 새로운 사실을 발견했네여!!
배열도 참조 타입이기때문에 그렇다고 하니 이해가 됩니다.
반응형