개념
- 사전적 의미로는 '사전'을 의미
- Key와 Value를 한 쌍으로써 선언
- 자바의 'Map'에 해당
- Key는 중복될 수 없으며 순서가 없어 배열처럼 index로 접근하는 것이 불가능
- C#의 Indexer로 접근이 가능
- foreach를 이용하여 KeyValuePair의 형태로 사용 가능
사용 목적
- 배열이나 리스트처럼 Index가 아닌, Key값으로 구분하여 찾기 위함
사용 예시
Dictionary<string, int> dic = new Dictionary<string, int>();
// Dictionary에 정보를 추가
dic.Add("나이", 30);
dic.Add("키", 173);
dic.Add("몸무게", 80);
// Key를 통해 해당 정보를 불러오기
System.Console.WriteLine( string.Format("나이 : {0}", dic["나이"]) );
System.Console.WriteLine( string.Format("키 : {0}", dic["키"]) );
System.Console.WriteLine( string.Format("몸무게 : {0}", dic["몸무게"]) );
// 결과
나이 : 30
키 : 173
몸무게 : 80
추가적으로
- enum과 struct 자체는 값 타입이라서 힙 메모리에 할당되지는 않는다.
그러나, Dictionary의 Key에 enum과 struct를 사용하면 가비지가 발생할 수 있다.
*Struct 가비지 발생
- Struct를 선언할 때 Equals(), GetHashCode() 메서드들을 구현하지 않은 상태에서 Dictionary의 Contains 메서드를 호출하게 되면 내부적으로 object로 박싱하여 Object.Equals()를 통해 비교 구문을 실행하게 된다.
(Contains 뿐만 아니라 Key의 비교 구문이 실행되면 같은 현상이 발생하게 된다.)
*Enum 가비지 발생
- Struct와 마찬가지로 Equals() 메서드 또한 object로 박싱하여 비교하기 때문에 가비지가 발생한다.
이를 해결하기 위한 가장 간단한 방법은 'System.Collections.Generic' 네임 스페이스 내부에 존재하는 'IEqualityComparer<T>' 인터페이스를 상속받는 클래스를 선언해서 비교하게 하는 방법이 있다. Dictionary 인스턴스를 생성할 때 생성자에 인스턴스를 넣어주면 된다.
Dictionary<SomeStruct, int> dic = new Dictionary<SomeStruct, int>(new SomeComparer());
SomeStruct : struct형 키값
SomeComparer() : IEqualityComparer를 상속받는 비교 클래스

RememberCook 9월 28일 정식 출시!
두번째 게임인 RememberCook이 출시되었습니다. 귀여운 캐릭터들이 나오는 간단한 게임이며 플레이어의 공간인지능력을 테스트하는 게임입니다. 아래 링크를 통해 다운 받으실 수 있으니 많은 관��
chipmunk-plump-plump.tistory.com
'프로그래밍 > 기본기ㆍ자료구조' 카테고리의 다른 글
Goto (0) | 2020.09.25 |
---|---|
람다식 (3) | 2020.05.15 |
Generic (제네릭) (6) | 2020.05.13 |
Clean Code (클린코드) (5) | 2020.05.03 |
BackBuffer (백버퍼) (5) | 2020.05.01 |