NameValueCollection
NameValueCollection
은 .NET에서 제공하는 특수한 컬렉션으로, 키와 값의 쌍으로 데이터를 저장하지만, 각 키에 대해 여러 값을 저장할 수 있는 기능을 제공합니다. 이는 일반적인 키-값 구조인 Dictionary
와 유사하지만, 여러 값의 중복 저장을 지원하여 특정 시나리오에서 더 유연하게 사용할 수 있습니다.
주요 특징
- 다중 값 지원:
NameValueCollection
은 하나의 키에 여러 값을 할당할 수 있어, 동일한 키를 여러 번 추가해도 각 값이 모두 유지됩니다. 이는 동일한 속성에 대해 여러 개의 값을 가지는 경우 매우 유용합니다. - 키와 값의 문자열 저장: 모든 키와 값은 문자열 형식으로 저장됩니다. 이는 문자열 데이터를 효율적으로 관리할 수 있도록 하며, 다양한 상황에서 쉽게 사용될 수 있습니다.
- 이름-값 기반 접근: 이름Key을 통해 여러 값을 접근할 수 있으며, 각 값은 콤마로 구분된 문자열로 반환됩니다.
장점
- 유연한 값 관리: 동일한 키에 대해 여러 값을 저장할 수 있어, 복잡한 데이터 구조를 간단히 표현할 수 있습니다.
- 간단한 API: 사용법이 간단하여 쉽게 키-값 데이터를 관리할 수 있습니다.
단점
- 타입 제한: 키와 값이 모두 문자열로 제한되므로, 다른 타입의 데이터를 저장하려면 문자열로 변환해야 합니다.
- 성능: Dictionary에 비해 상대적으로 느릴 수 있으며, 특히 많은 데이터를 처리할 때 성능 저하가 발생할 수 있습니다.
- 박싱 / 언박싱 문제: 문자열 외의 데이터를 저장하려면 변환이 필요하기 때문에, 이러한 변환 과정에서 성능 문제가 발생할 수 있습니다.
기본 사용법
NameValueCollection
은 직접 생성자를 통해 생성하고, 키와 값을 추가하거나 접근할 수 있습니다.
using System;
using System.Collections.Specialized;
class Program
{
static void Main()
{
var nvc = new NameValueCollection();
// 키-값 추가
nvc.Add("Color", "Red");
nvc.Add("Color", "Blue");
nvc.Add("Shape", "Circle");
// 특정 키의 모든 값 출력
foreach (string key in nvc.AllKeys)
{
Console.WriteLine($"{key}: {nvc[key]}");
}
}
}
Add
메서드를 통해 여러 값을 동일한 키에 추가할 수 있습니다.AllKeys
프로퍼티를 통해 모든 키에 접근할 수 있습니다.- 동일한 키에 대해 여러 값이 저장된 경우, 반환된 값은 콤마로 구분된 문자열입니다.
주요 메서드와 프로퍼티
Add(string key, string value)
: 컬렉션에 새로운 키-값 쌍을 추가합니다. 동일한 키가 이미 존재하는 경우, 새 값이 추가되어 기존 값에 병합됩니다.Remove(string key)
: 지정된 키와 연결된 모든 값을 제거합니다.Get(string key)
: 지정된 키와 연결된 값을 반환합니다. 여러 값이 있는 경우, 콤마로 구분된 문자열로 반환됩니다.Set(string key, string value)
: 지정된 키에 대해 값을 설정합니다. 기존 값을 모두 덮어씁니다.AllKeys
: 컬렉션에 있는 모든 키를 배열 형태로 반환합니다.
활용 사례
- 웹 설정 관리: 웹 애플리케이션에서 여러 값을 가진 설정이나 속성을 관리할 때 사용됩니다. 예를 들어, HTTP 헤더나 쿼리 매개변수처럼 동일한 키에 여러 값을 가질 수 있는 데이터를 처리할 때 유용합니다.
- 구성 설정: 애플리케이션에서 여러 값을 가지는 구성 설정을 간단히 관리하는 용도로 사용할 수 있습니다.
한계
- 유연성 부족: 모든 키와 값이 문자열로 제한되기 때문에, 복잡한 데이터 구조를 표현하거나 다양한 타입을 저장하는 데 한계가 있습니다.
- 성능 문제: 많은 양의 데이터를 저장하거나 조회할 때
Dictionary
와 비교해 성능이 떨어질 수 있습니다. 또한, 문자열로 변환하는 과정에서 박싱과 언박싱이 필요할 수 있어 성능이 저하될 가능성이 있습니다.NameValueCollection
은 여러 값을 같은 키로 관리해야 하는 특수한 경우에 유용하지만, 성능이나 타입 유연성이 중요한 경우에는 다른 컬렉션을 사용하는 것이 좋습니다.