▶컬렉션
리스트, 사전, 배열과 같은 대량의 데이터를 관리 및 제어할 수 있는 클래스를 의미한다.
▷ C#언어 컬렉션의 특징
1. C# 언어의 컬렉션은 기본적으로 모든 타입의 데이터를 보관하는 것이 가능하다.
- 즉, Object 형을 기본으로 동작하도록 설계되어 있다.
2. C# 언어의 컬렉션은 내부적으로 Object 형으로 동작하기 때문에, 값 형식의 데이터를 제어할 경우 박싱과 언박싱이 발생하기 때문에 필연적으로 퍼포먼스 저하가 발생한다.
(note) 컬렉션 -> object ->박싱/언박싱
▷ArrayList 값을 foreach와 enmerator로 컬렉션 순회하기
※ 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
'C# > C# 학습 (TIL)' 카테고리의 다른 글
C# SendMessage / Attributes (0) | 2022.07.02 |
---|---|
C# 인덱서, 제네릭, 확장메서드 (0) | 2022.07.01 |
C# Array 배열/ Static Class 정적 클래스 / Extend Method 확장메서드 / 변수 표기법 / StringBuilder (0) | 2022.06.29 |
C# 자료형의 특징 , 변수의 특징 - 값 형식 / 참조 형식 데이터 타입 (0) | 2022.06.29 |
C# CLR(공통언어런타임) / CIL(공통 중간 언어) / C#의 메모리 관리 방식 (0) | 2022.06.28 |