본문 바로가기
C#/C# 학습 (TIL)

C# 컬렉션 - 딕셔너리 / 해쉬테이블

by jjiing 2022. 6. 30.

 

▶컬렉션

리스트, 사전, 배열과 같은 대량의 데이터를 관리 및 제어할 수 있는 클래스를 의미한다.
 
 ▷ C#언어 컬렉션의 특징

1. C# 언어의 컬렉션은 기본적으로 모든 타입의 데이터를 보관하는 것이 가능하다.
- 즉, Object 형을 기본으로 동작하도록 설계되어 있다.
2. C# 언어의 컬렉션은 내부적으로 Object 형으로 동작하기 때문에, 값 형식의 데이터를 제어할 경우 박싱과 언박싱이 발생하기 때문에 필연적으로 퍼포먼스 저하가 발생한다.

(note) 컬렉션 -> object ->박싱/언박싱

 

 

 

▷ArrayList 값을 foreach와 enmerator로 컬렉션 순회하기

 

oValueList에 1~5 넣기.
이너머레이터 변수에 담기. 스트링빌더 변수 선언
foreach/ enumerator 기반으로 컬렉션 순회
결과는 둘 다 같음

 

※ foreach 또는 이너머레이터 기반의 컬렉션 순회는 내부적으로 가비지 컬렉션을 유발하기 때문에 가능한 사용을 자제해야한다.
즉, 퍼포먼스가 별도로 필요없는 로직에서만 제한적으로 사용한다.

 

퍼포먼스가 별도로 필요없는 로직?

ex) 문자 + 문자열(파일 시스템 ->케바케) + 옵션 값 세팅(INI)
            - 주로 환경설정에 많이 사용된느 포맷
       

파일시스템?

외부 파일을 들여오거나 내보낼 때 쓰는 시스템 .
   - 예외가 들어간 포맷은 사용 ok / 그렇지 않다면 no
예외가 들어가지 않은 포맷 : txt
예외가 들어간 포맷 : Json, XML 

 

 

 

 

 

 

 

▷Dictionary와 HashTable

 

▶딕셔너리(Dictionary)
    Key와 Value를 사용해서 자료를 저장하는 자료구조
        - 빠르게 데이터를 검색할 수 있다.

 


▷딕셔너리 특징 (해쉬테이블과 반대)

1. 제네릭
2. Key와 Value 모두 Strong Type을 입력받는다.(제네릭이기 때문)
        -Strong Type : 선언시 타입을 입력해줘야 한다는 뜻
        - 강력한 형식이라고 하며 서로 다른 데이터 타입을 사용할 수 있는 문법에 엄격한 제한을 두는 방식
         (오류방지 ->c계열 언어는 프로그래밍 언어중에 타입에 매우 엄격한 언어)
3. 따라서 박싱과 언박싱이 일어나지 않는다.
4. 선언시 자료형을 명시해야한다.
5. 자료형을 명시하기 때문에 형변환 리스크가 없다.

 

 

 

▶해시테이블(HashTable)   
Key와 Value를 사용해서 자료를 저장하는 자료구조


- 빠르게 데이터를 검색할 수 있다.

- key 값을 hash 함수에 넣어 코드값으로 변경한 후 Bucket이라는 저장공간에 인덱스 번호를 맵핑 시켜서 데이터를 저장한다.
  -해시테이블은 각각의 Key값에 해시 함수를 적용해 배열의 고유한 INDEX를 생성하고, 이 INDEX를 활용하여 값을 저장하거나 검색하는 곳에 사용이 된다.
    (여기서 실제 값이 저장되는 장소를 버킷 또는 슬롯이라고 한다.)


▷해시테이블 특징

 

1. 제네릭을 사용하지 않는다.
2. Key와 Value 모두 Object를 입력받는다.
3. 따라서 박싱과 언박싱을 사용한다.
4. 자료형을 명시하지 않아도 된다.

 

 제네릭을 이용하지 않고 Object를 입력받기 때문에 모든 데이터 타입을 처리할 수 있다.(장점)
     하지만 내부적으로 입력과 출력에 박싱과 언박싱이 발생한다. (-> 성능저하) (단점)

 

 

 

 

 

▶ .Net의 HashTable과 Dictionary<T>의 특징★★

 -키를 가지고 빠르게 값에 접근하기에 좋다.
-★★★★★ 순서나 중복되는 데이터가 있는 경우에는 사용을 고려한다면 완벽한 판단미스
- 단점 : 미리 저장공간을 확보하기 때문에 메모리 효율은 좋지 않다.
- 평균적으로 제네릭을 사용하고 연산이 빠른 Dictionary를 더 많이 사용하는 편
- 해시테이블보다 딕셔너리가 연산속도가 더 빠르다.
   (모든 타입을 받는지 아닌지에 대한 여부 차이)


▶결론
둘 다 사용법은 비슷하지만 내부적인 처리와 수용하는 타입의 형태가 다르므로 필요에 따라 어느걸 사용할지는 신중히 고민을 해봐야한다.

- 해시테이블 : 
        Value에 일정한 형식이 없고 여러 형태를 사용할 때

- 딕셔너리 : 
        고정적으로 하나의 타입만 입력 받을 때

 

 

(참고)

.Net : HashTable
 C++ : Map
 C# : Dictionary