[Data Structure] 딕셔너리(Dictionary)
Dictionary 란?
Dictionary는 키(Key)와 값(Value) 쌍으로 데이터를 저장하는 비선형 자료구조입니다. 마치 사전처럼, 키를 이용하여 원하는 값을 빠르게 검색할 수 있습니다. Dictionary는 다음과 같은 특징을 가지고 있습니다.
- 키-값 쌍: 데이터가 키와 값의 형태로 저장됩니다. 키는 데이터를 식별하는 고유한 값이며, 값은 키에 해당하는 데이터입니다. 마치 이름표와 내용물처럼, 키는 값을 찾기 위한 열쇠 역할을 합니다.
- 빠른 검색: 키를 이용하여 O(1)의 시간 복잡도로 데이터에 빠르게 접근할 수 있습니다. 마치 책갈피를 이용하여 원하는 페이지를 바로 펼치는 것처럼, Dictionary는 키를 통해 원하는 값에 즉시 접근할 수 있습니다.
- 유연한 자료형: 키와 값은 다양한 자료형(정수, 문자열, 리스트, 딕셔너리 등)을 사용할 수 있습니다. 마치 다양한 종류의 재료로 요리하는 것처럼, Dictionary는 다양한 형태의 데이터를 담을 수 있습니다.
- 순서 없음 (Python 3.7+): Python 3.7 이상에서는 Dictionary의 요소들이 삽입 순서를 유지합니다. 하지만, 이전 버전에서는 순서가 보장되지 않았습니다.
해시맵(Hash Map)과 차이점
장점단점
장점
- 빠른 데이터 검색: 키를 사용하여 O(1)의 시간 복잡도로 데이터에 빠르게 접근할 수 있습니다. 마치 주소록에서 이름을 검색하여 전화번호를 바로 찾는 것처럼, Dictionary는 빠른 데이터 검색을 지원합니다.
- 유연한 자료형: 키와 값으로 다양한 자료형을 사용할 수 있어 다양한 데이터를 효율적으로 관리할 수 있습니다. 마치 백화점의 다양한 상품처럼, Dictionary는 여러 종류의 데이터를 담을 수 있습니다.
- 간단한 사용법: 직관적인 API를 제공하여 쉽게 데이터를 저장하고 검색할 수 있습니다. 마치 레시피를 따라 요리하는 것처럼, Dictionary는 사용하기 간편합니다.
단점
- 메모리 사용: 데이터를 키-값 쌍으로 저장하므로 배열에 비해 메모리 사용량이 많을 수 있습니다. 마치 큰 방에 가구를 배치하는 것처럼, Dictionary는 배열보다 메모리 공간을 더 사용할 수 있습니다.
- 해시 충돌 가능성: 키의 범위가 넓을 경우 해시 충돌이 발생하여 검색 성능이 저하될 수 있습니다. 마치 도로가 막히는 것처럼, Dictionary는 해시 충돌로 인해 검색 속도가 느려질 수 있습니다.
- 순서 없음 (Python 3.7 이전): Python 3.7 이전 버전에서는 데이터의 삽입 순서가 보장되지 않아 순서가 중요한 경우 다른 자료구조를 사용해야 합니다.
Dictionary의 활용 분야
Dictionary는 다양한 분야에서 활용됩니다.
- 데이터베이스: 데이터베이스의 레코드를 Dictionary 형태로 표현하여 관리합니다.
- 웹 개발: 웹 페이지의 요청과 응답 데이터를 Dictionary 형태로 처리합니다.
- 게임 개발: 게임 캐릭터의 속성, 아이템 정보 등을 Dictionary 형태로 관리합니다.
- 자연어 처리: 단어와 빈도수를 Dictionary 형태로 저장하여 분석합니다.
문제점&주의사항
-
키의 유일성: Dictionary의 키는 유일해야 합니다. 중복된 키를 사용하면 값이 덮어씌워지거나 오류가 발생할 수 있습니다. 마치 주민등록번호처럼, 키는 데이터를 식별하는 고유한 값이어야 합니다.
-
해시 충돌: 키의 범위가 넓을 경우 해시 충돌이 발생하여 검색 성능이 저하될 수 있습니다. 이 경우 해시 충돌을 해결하기 위한 별도의 자료구조(예: 연결 리스트)를 사용해야 할 수 있습니다. 마치 교통 체증을 해결하기 위해 우회로를 만드는 것처럼, Dictionary는 해시 충돌에 대비해야 합니다.
-
메모리 관리: Dictionary는 배열에 비해 메모리 사용량이 많을 수 있으므로 메모리 관리에 주의해야 합니다. 더 이상 사용하지 않는 Dictionary는 메모리에서 해제하여 메모리 누수를 방지해야 합니다. 마치 사용한 컵을 깨끗이 씻는 것처럼, Dictionary를 사용 후에는 메모리를 정리해야 합니다.
예제
using System;
using System.Collections.Generic;
class DictionarySample
{
static void Main(string[] args)
{
// 1. 딕셔너리 생성
Dictionary<string, int> myDict = new Dictionary<string, int>();
// 2. 데이터 추가
myDict.Add("Alice", 30);
myDict.Add("Bob", 25);
myDict.Add("Charlie", 35);
// 3. 데이터 접근
Console.WriteLine(myDict["Alice"]); // 30 출력
Console.WriteLine(myDict.ContainsKey("Bob")); // True 출력
Console.WriteLine(myDict.ContainsValue(25)); // True 출력
// 4. 데이터 수정
myDict["Alice"] = 31;
// 5. 데이터 삭제
myDict.Remove("Charlie");
// 6. 딕셔너리 순회
foreach (KeyValuePair<string, int> pair in myDict)
{
Console.WriteLine($"{pair.Key}: {pair.Value}");
}
// 7. 딕셔너리 길이
Console.WriteLine(myDict.Count); // 2 출력
}
}