본문 바로가기

프로그래밍/기본기ㆍ자료구조

Dictionary (딕셔너리)

728x90
반응형

개념

- 사전적 의미로는 '사전'을 의미

- 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