Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 제네릭(Generic)과 비제네릭(Non-Generic) 컬렉션의 차이점 완벽 정리

C#에서는 데이터를 담고 관리하는 컬렉션을 크게 두 가지로 나눌 수 있습니다. 바로 비제네릭(Non-Generic) 컬렉션제네릭(Generic) 컬렉션입니다. 두 방식은 타입 안정성(Type Safety)과 성능 면에서 중요한 차이를 보이기 때문에, 상황에 맞는 컬렉션을 선택하는 것이 효율적인 코드 작성의 핵심입니다.

C#의 제네릭(Generic)이란?

제네릭 컬렉션은 동일한 데이터 타입의 요소만 저장할 수 있는 컬렉션입니다. 컴파일 시점에 타입이 결정되므로 잘못된 타입의 데이터가 들어가는 것을 사전에 방지할 수 있으며, 불필요한 박싱(Boxing)과 언박싱(Unboxing)이 발생하지 않아 성능 면에서도 유리합니다.

대표적인 제네릭 컬렉션은 다음과 같습니다.

  • List<T>
  • Dictionary<TKey, TValue>
  • HashSet<T>

Dictionary<TKey, TValue>

Dictionary는 C#에서 키(Key)와 값(Value)의 쌍으로 데이터를 저장하는 컬렉션입니다. 각 요소는 고유한 키로 식별되며, 키를 통해 값을 빠르게 조회할 수 있습니다. Dictionary<TKey, TValue>는 System.Collections.Generic 네임스페이스에 포함되어 있습니다.

HashSet<T>

HashSet은 배열이나 문자열 목록에서 중복된 요소를 자동으로 제거해 주는 최적화된 집합(Set) 컬렉션입니다. 순서보다는 고유한 값의 집합을 관리하는 데 적합하며, 빠른 검색 성능을 제공합니다.

C#의 비제네릭(Non-Generic)이란?

비제네릭 컬렉션은 서로 다른 데이터 타입의 요소를 함께 저장할 수 있는 컬렉션입니다. 모든 요소가 object 타입으로 처리되기 때문에 유연하지만, 타입 안정성이 떨어지고 값 타입 저장 시 박싱·언박싱으로 인한 성능 저하가 발생할 수 있습니다.

대표적인 비제네릭 컬렉션에는 ArrayList와 BitArray가 있습니다.

ArrayList

ArrayList는 개별적으로 인덱스에 접근할 수 있는 순서가 있는 객체 컬렉션을 나타냅니다. 배열의 대안으로 사용되며, 일반 배열과 달리 인덱스를 지정하여 원하는 위치에 요소를 추가하거나 제거할 수 있고, 컬렉션의 크기도 자동으로 조절됩니다.

BitArray

BitArray는 1과 0의 값으로 이루어진 이진수 표현의 배열을 나타냅니다. 비트(bit) 단위의 데이터를 저장해야 하지만 필요한 비트 수를 미리 알 수 없는 경우에 유용하게 사용됩니다.

정리: 어떤 것을 선택해야 할까?

일반적으로 C#에서는 타입 안정성과 성능이 보장되는 제네릭 컬렉션을 우선적으로 사용하는 것이 권장됩니다. 다양한 타입을 하나의 컬렉션에 담아야 하는 특수한 상황이 아니라면, List<T>, Dictionary<TKey, TValue>, HashSet<T> 같은 제네릭 컬렉션이 더 안전하고 효율적인 선택입니다.