ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C# 초보자가 가장 많이 하는 실수: List 사용법
    개발/C# 2026. 1. 12. 10:21
    반응형

    C# 개발을 할 때 가장 자주 사용하는 컬렉션은 단연 List<T>일 것입니다. 하지만 데이터를 수만 건씩 넣을 때 리스트가 내부적으로 어떻게 작동하는지 모르면 나도 모르게 메모리 낭비와 성능 저하를 일으킬 수 있습니다.

    오늘은 캡처 없이 코드만으로 List의 성능을 극대화하는 'Capacity' 최적화 전략을 알아보겠습니다.

     

     

     

    1. 리스트는 어떻게 늘어날까? (내부 원리)

    C#의 List<T>는 고정된 크기의 **배열(Array)**을 기반으로 작동합니다. 리스트에 데이터를 계속 추가(Add)하다가 정해진 공간이 꽉 차면, 리스트는 아래와 같은 과정을 거칩니다.

    1. 기존보다 2배 더 큰 새로운 배열을 만듭니다.
    2. 기존 데이터를 새 배열로 전부 복사합니다.
    3. 기존 배열을 버립니다.

    데이터가 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를 써야 할까요?

    1. 반복문 횟수를 알 때: for문이나 foreach문으로 대량의 데이터를 리스트에 담기 직전에 사용하세요.
    2. 메모리 효율이 중요할 때: 너무 크게 잡으면 메모리가 낭비되지만, 정확한 크기를 알면 TrimExcess() 메서드로 남는 공간을 제거할 수도 있습니다.
    3. 성능이 민감한 API 개발 시: 대량의 데이터를 반환하는 서비스라면 필수입니다.

     

     

     

    마무리하며 아주 작은 차이 같지만, 대규모 프로젝트나 실시간 데이터 처리가 중요한 환경에서는 이 Capacity 설정 하나가 서버의 부담을 크게 줄여줍니다. 지금 바로 여러분의 프로젝트에서 new List<T>()를 찾아보세요

     

     

     

     

    반응형
Designed by Tistory.