IMCAT.DEV
로그인 가입
C# 중급 알고리즘

C# 컬렉션의 성능 최적화

C# 컬렉션의 성능 최적화 — 중급

컬렉션의 성능 최적화

1. 도입 (왜 배워야 하는가)

컬렉션은 프로그램에서 데이터를 저장하고 관리하는 기본적인 도구입니다. 특히 C#에서는 List, Dictionary, HashSet과 같은 다양한 컬렉션을 제공하여 개발자가 효율적으로 데이터를 다룰 수 있도록 합니다. 하지만, 이러한 컬렉션을 비효율적으로 사용할 경우, 성능 저하와 함께 메모리 낭비라는 문제를 초래할 수 있습니다.

실무에서는 데이터의 양이 많아질수록 성능 최적화가 더욱 중요해집니다. 예를 들어, 대규모 웹 애플리케이션에서 사용자의 요청을 처리할 때, 컬렉션의 성능이 떨어지면 전체 시스템의 응답 속도가 느려질 수 있습니다. 따라서, 적절한 컬렉션 선택과 성능 최적화는 필수입니다.

2. 핵심 개념 설명

컬렉션의 성능 최적화에 있어 중요한 개념은 다음과 같습니다:

  • List<T>: 순차적으로 데이터를 저장하는 동적 배열입니다. 인덱스 기반 접근이 가능하여 빠른 조회가 가능합니다.
  • Dictionary<TKey, TValue>: 키와 값의 쌍으로 데이터를 저장합니다. 해시 테이블을 사용하여 빠른 검색을 지원합니다.
  • HashSet<T>: 중복을 허용하지 않는 데이터 집합으로, 빠른 검색과 추가가 필요할 때 유용합니다.
  • 용어설명비유
    List<T>순서가 있는 데이터의 집합책장에 정리된 책들
    Dictionary<TKey, TValue>키-값 쌍으로 구성된 데이터 집합전화번호부: 이름(키)과 전화번호(값)
    HashSet<T>중복을 허용하지 않는 데이터 집합유니크한 스티커 모음

    3. 기본 코드 예제

    가장 기본적인 List<T> 사용법을 보여드리겠습니다.

    using System;
    using System.Collections.Generic;
    
    class Program
    {
        static void Main()
        {
            // List 생성
            List<int> numbers = new List<int>();
    
            // 값 추가
            numbers.Add(1);  // 리스트에 1 추가
            numbers.Add(2);  // 리스트에 2 추가
            numbers.Add(3);  // 리스트에 3 추가
    
            // 값 출력
            foreach (var number in numbers)
            {
                Console.WriteLine(number);  // 리스트의 각 값 출력
            }
        }
    }

    실행 결과:

    1
    2
    3
  • List<int> numbers = new List<int>();: 정수형 List를 생성합니다.
  • numbers.Add(1);: List에 1을 추가합니다.
  • foreach (var number in numbers): List의 각 요소를 반복문을 통해 순회합니다.
  • Console.WriteLine(number);: 현재 순회 중인 값을 출력합니다.
  • 4. 실전 활용 예제

    쇼핑몰에서 장바구니를 구현할 때

    장바구니에 담긴 상품을 관리하기 위해 List<T>를 사용합니다.

    using System;
    using System.Collections.Generic;
    
    class ShoppingCart
    {
        private List<string> items = new List<string>();
    
        public void AddItem(string item)
        {
            items.Add(item);
            Console.WriteLine($"{item}이 장바구니에 추가되었습니다.");
        }
    
        public void ShowItems()
        {
            Console.WriteLine("장바구니의 상품 목록:");
            foreach (var item in items)
            {
                Console.WriteLine(item);
            }
        }
    }
    
    class Program
    {
        static void Main()
        {
            ShoppingCart cart = new ShoppingCart();
            cart.AddItem("티셔츠");
            cart.AddItem("바지");
            cart.ShowItems();
        }
    }

    실행 결과:

    티셔츠이 장바구니에 추가되었습니다.
    바지이 장바구니에 추가되었습니다.
    장바구니의 상품 목록:
    티셔츠
    바지

    대규모 데이터 처리

    Dictionary<TKey, TValue>는 대량의 데이터를 관리할 때 유용합니다. 예를 들어, 사용자의 정보를 관리할 때 키를 사용자 ID로 하고 값을 사용자 객체로 설정할 수 있습니다.

    using System;
    using System.Collections.Generic;
    
    class User
    {
        public string Name { get; set; }
    }
    
    class Program
    {
        static void Main()
        {
            Dictionary<int, User> users = new Dictionary<int, User>();
    
            // 사용자 추가
            users.Add(1, new User() { Name = "Alice" });
            users.Add(2, new User() { Name = "Bob" });
    
            // 사용자 조회
            Console.WriteLine(users[1].Name);  // Alice 출력
        }
    }

    실행 결과:

    Alice

    5. 흔한 실수와 주의사항

    1. List<T>의 인덱스 초과

    잘못된 인덱스를 사용하여 List<T>에 접근하면 ArgumentOutOfRangeException이 발생합니다.

    var numbers = new List<int> { 1, 2, 3 };
    // Console.WriteLine(numbers[5]);  // 잘못된 인덱스 사용

    2. Dictionary<TKey, TValue>에 중복 키 추가

    Dictionary에 이미 존재하는 키로 값을 추가하려 하면 ArgumentException이 발생합니다.

    var users = new Dictionary<int, string>();
    users.Add(1, "Alice");
    users.Add(1, "Bob");  // 중복된 키 사용

    6. 정리

  • 컬렉션의 성능 최적화는 프로그램의 성능에 큰 영향을 미친다.
  • List<T>, Dictionary<TKey, TValue>, HashSet<T> 등의 컬렉션을 적절히 선택해야 한다.
  • 인덱스 초과, 중복 키 추가와 같은 실수를 피하는 것이 중요하다.
  • 다음에 학습하면 좋은 주제: LINQ를 이용한 데이터 처리, 비동기 프로그래밍, 메모리 관리.