-
C# 초보자가 가장 많이 하는 실수: List 사용법개발/C# 2026. 1. 12. 10:21반응형
C# 개발을 할 때 가장 자주 사용하는 컬렉션은 단연 List<T>일 것입니다. 하지만 데이터를 수만 건씩 넣을 때 리스트가 내부적으로 어떻게 작동하는지 모르면 나도 모르게 메모리 낭비와 성능 저하를 일으킬 수 있습니다.
오늘은 캡처 없이 코드만으로 List의 성능을 극대화하는 'Capacity' 최적화 전략을 알아보겠습니다.
1. 리스트는 어떻게 늘어날까? (내부 원리)
C#의 List<T>는 고정된 크기의 **배열(Array)**을 기반으로 작동합니다. 리스트에 데이터를 계속 추가(Add)하다가 정해진 공간이 꽉 차면, 리스트는 아래와 같은 과정을 거칩니다.
- 기존보다 2배 더 큰 새로운 배열을 만듭니다.
- 기존 데이터를 새 배열로 전부 복사합니다.
- 기존 배열을 버립니다.
데이터가 10,000개라면 이 "이사 작업"이 여러 번 반복되면서 CPU와 메모리에 큰 부담을 줍니다.
2. 성능 저하를 일으키는 코드 (Before)
아래 코드는 10만 개의 데이터를 넣을 때, 내부적으로 수많은 '배열 복사'를 일으킵니다.
// 크기를 지정하지 않고 생성 (기본 Capacity는 0 또는 4) List<int> numbers = new List<int>(); for (int i = 0; i < 100000; i++) { numbers.Add(i); // 공간이 찰 때마다 배열 복사 발생! }3. 속도를 높이는 최적화 코드 (After)
만약 넣을 데이터의 양을 대략이라도 알고 있다면, 처음부터 공간을 예약하세요. 이것만으로도 복사 과정을 생략해 속도가 비약적으로 빨라집니다.
// 처음부터 10만 개의 공간을 예약 (Capacity 설정) List<int> numbers = new List<int>(100000); for (int i = 0; i < 100000; i++) { numbers.Add(i); // 이사 과정 없이 바로 데이터 삽입! }또는 이미 생성된 리스트의 크기를 나중에 조절할 수도 있습니다.
numbers.Capacity = 100000;4. 언제 Capacity를 써야 할까요?
- 반복문 횟수를 알 때: for문이나 foreach문으로 대량의 데이터를 리스트에 담기 직전에 사용하세요.
- 메모리 효율이 중요할 때: 너무 크게 잡으면 메모리가 낭비되지만, 정확한 크기를 알면 TrimExcess() 메서드로 남는 공간을 제거할 수도 있습니다.
- 성능이 민감한 API 개발 시: 대량의 데이터를 반환하는 서비스라면 필수입니다.
마무리하며 아주 작은 차이 같지만, 대규모 프로젝트나 실시간 데이터 처리가 중요한 환경에서는 이 Capacity 설정 하나가 서버의 부담을 크게 줄여줍니다. 지금 바로 여러분의 프로젝트에서 new List<T>()를 찾아보세요
반응형'개발 > C#' 카테고리의 다른 글
C# 비동기 프로그래밍(async/await) (1) 2026.01.14 C# 문자열 합치기, 아직도 + 연산자만 쓰시나요? (String vs StringBuilder) (0) 2026.01.13 C# NullReferenceException 해결법: "객체 참조가 개체의 인스턴스로 설정되지 않았습니다" (0) 2026.01.09 C# Windows Form [2] UI 속성 사용법 (2) 2024.01.10 C# Windows Form [1] 윈폼 개발시작하기 (1) 2024.01.09