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 대상


✅ 결론

항목 정리
저장 위치 배열도 리스트도 실제 데이터는 힙에 저장됨
크기 배열은 고정, 리스트는 가변
기능 배열은 단순, 리스트는 편리한 기능 많음
메모리 구조 리스트는 배열을 감싸는 클래스 형태의 구조
성능 배열이 더 빠르지만 유연성은 리스트가 더 좋음

흠..기본적인 간단한 구조라면 배열을 사용하고 그렇지않고 가변적으로 계속 사용해야 할때는 리스트가 확실히 나을듯 하네요!

그리고 개인적으로 든 생각은 정적인것은 스택, 동적인건 힙인줄 알고있었고

그래서 배열은 정적이니까 스택에 들어가고 리스트가 힙에 들어갈 줄 알았는데 둘다 힙에 들어간다니 새로운 사실을 발견했네여!!

배열도 참조 타입이기때문에 그렇다고 하니 이해가 됩니다.

반응형