Dictionary 와 Hashset
Dictionary
와 HashSet
은 둘 다 .NET에서 데이터의 빠른 조회와 관리를 위한 컬렉션이지만, 사용 목적과 내부 동작 방식이 다릅니다. 이 차이점은 주로 사용 시나리오에 따라 성능과 효율성에 영향을 미칠 수 있습니다.
1. Dictionary<TKey, TValue>
Dictionary
는 키-값 쌍으로 데이터를 저장하는 컬렉션입니다. 즉, 특정 키에 매핑된 값을 저장하고, 이를 키를 사용해 빠르게 조회할 수 있습니다.
- 구조:
Dictionary
는 내부적으로 해시 테이블을 사용해 키를 기반으로 값에 빠르게 접근할 수 있도록 설계되었습니다. 키는 고유해야 하며, 동일한 키로 여러 값을 저장할 수 없습니다. - 시간 복잡도:
Dictionary
에서 값을 검색하는 작업의 시간 복잡도는 평균적으로 O(1)입니다. 이는 해시 충돌이 거의 없는 경우 매우 빠른 조회를 의미합니다. - 사용 목적: 주로 특정 키를 사용하여 값에 빠르게 접근해야 하는 경우 사용됩니다. 예를 들어,
db.dicProduct.Values
와 같은 데이터베이스 조회 결과를 캐싱하여, 키(예:SerialNo
)를 기반으로 해당 데이터를 빠르게 검색할 수 있습니다.
장점
- 빠른 조회: 키를 사용한 값 조회는 매우 빠릅니다.
- 키-값 쌍 관리: 각 키에 대해 값을 저장할 수 있기 때문에, 값과 관련된 추가 정보가 있는 경우 유용합니다.
단점
- 메모리 사용량: 키와 값을 모두 저장해야 하기 때문에, 메모리 사용량이 더 큽니다.
- 해시 충돌: 해시 충돌이 발생할 경우 성능이 저하될 수 있습니다. 그러나 해시 충돌은 잘 설계된 해시 함수와 적절한 데이터 분포에서 드문 일입니다.
2. HashSet<T>
HashSet
은 고유한 값들의 집합을 관리하는 컬렉션입니다. 즉, 동일한 값을 여러 번 저장하지 않으며, 중복을 허용하지 않습니다.
- 구조:
HashSet
은 해시 테이블을 기반으로 하며, 값 자체가 키 역할을 합니다. 중복을 허용하지 않기 때문에, 삽입할 때 이미 존재하는 값인지 여부를 확인하는 과정이 포함됩니다. - 시간 복잡도:
HashSet
의 삽입, 삭제, 조회 작업의 시간 복잡도는 평균적으로 O(1)입니다. - 사용 목적: 중복되지 않는 값들의 집합을 관리할 때 사용됩니다. 예를 들어, 특정
Part
에 대한 고유SerialNo
목록을 관리하거나, 존재 여부만 빠르게 확인하는 경우에 적합합니다.
장점
- 중복 방지:
HashSet
은 중복된 값을 자동으로 걸러줍니다. - 빠른 존재 여부 확인: 특정 값이 집합에 있는지 확인하는 작업이 매우 빠릅니다.
- 메모리 효율성: 값만 저장하기 때문에, 메모리 사용량이
Dictionary
보다 적습니다.
단점
- 추가 정보 저장 불가: 값 자체가 키 역할을 하기 때문에, 키에 매핑되는 별도의 값을 저장할 수 없습니다.
- 삽입 순서 보장 안됨:
HashSet
은 삽입 순서를 유지하지 않습니다. 순서가 중요한 경우에는 적합하지 않습니다.
3. Dictionary
vs HashSet
차이점 요약
특성 | Dictionary<TKey, TValue> | HashSet |
---|---|---|
저장 형태 | 키-값 쌍 저장 | 고유한 값들의 집합 |
시간 복잡도 | 평균 O(1) (키를 사용한 조회) | 평균 O(1) (값 존재 여부 확인) |
메모리 사용량 | 더 많은 메모리 사용 (키와 값 저장) | 상대적으로 적은 메모리 사용 (값만 저장) |
중복 허용 여부 | 키는 중복 허용 안됨, 값은 중복 가능 | 중복된 값 허용 안됨 |
주요 사용 목적 | 키를 기준으로 값을 빠르게 조회해야 할 때 | 값의 존재 여부만 빠르게 확인하거나 중복을 피할 때 |
추가 정보 저장 | 키마다 값을 저장할 수 있음 | 값에 추가적인 정보를 저장할 수 없음 |
삽입 순서 | 삽입 순서가 유지됨 | 삽입 순서가 유지되지 않음 |
4. 사용 시나리오 비교
Dictionary
가 적합한 경우:- 데이터베이스에서 조회한 결과를 캐싱하거나, 여러 값(예: 제품명과 관련된 세부 정보)을 특정 키로 빠르게 접근해야 하는 경우.
- 예를 들어, 제품의
SerialNo
를 키로 사용하여 제품에 대한 세부 정보(예: 상태, 날짜, 회사)를 조회할 때 적합합니다.
HashSet
이 적합한 경우:- 중복되지 않는 고유한 값의 집합을 관리하거나, 특정 값이 존재하는지 여부만 확인해야 하는 경우.
- 예를 들어, 특정 파트에 대해 존재하는 고유
SerialNo
를 확인하거나 중복된SerialNo
를 방지할 때 유용합니다.
5. DB와의 연동 시 고려 사항
DB와 연동하는 상황에서는 데이터의 조회, 삽입, 업데이트와 관련된 최적화를 위해 컬렉션 선택이 중요합니다. 대규모 데이터셋을 다루거나 조회 속도가 중요한 경우, 컬렉션의 특성에 맞게 Dictionary
와 HashSet
을 적절하게 선택하여 성능을 개선할 수 있습니다. Dictionary
는 키 기반 조회에 적합하며, HashSet
은 중복 없이 값만 관리할 때 적합합니다.