Collection을 제작하는 과정에서 배열, List, ArrayList, Dictionary 중 하나를 선택하여
사용하곤 한다. 모든 사람이 같은 컬렉션을 쓰지 않고 다르게 쓰이는데 왜 그런지
각 개념의 차이점을 설명하면서 알아보고자 한다.
1. Array란?
Array는 고정 길이를 가진 동일한 데이터 타입의 컬렉션이다.
고정 길이를 가지고 있기 때문에 크기에 대한 동적 할당이 불가능 하다.
정적이며 연속적이고 메모리 효율적이다. 그래서 정해진 크기에서는
실행 속도가 빠르지만 반대의 상황에서는 메모리가 크게 낭비될 수 있다.
2. List란?
List는 고정되지 않는 가변 크기를 가지고 있는 동일한 데이터 타입의 컬렉션이다.
그렇기 때문에 데이터의 크기를 동적으로 할당 가능하다.
List는 포인터를 사용하여 다음 데이터의 주소 값을 가지고 있기 때문에
요소를 검색, 정렬, 조작, 추가, 제거 할 수 있다. 하지만 주소 값을 가지고
있어야 하기 때문에 메모리 효율이 좋지 않다.
3. ArrayList란?
ArrayList는 List와 동일하게 배열크기가 고정되지 않는다.
하지만 List는 같은 타입 끼리만 저장 가능하지만 ArrayList는
서로 다른 타입의 데이터를 배열에 저장 가능하다.
그렇기 때문에 데이터를 가져올 때 박싱, 언박싱이 일어난다.
바로 전 글에서 박싱, 언박싱을 다뤘는데 이 과정이 굉장히 많은
계산을 필요로 하기 때문에 과다한 사용 시 프로그램 속도가 느려질 수 있다.
그렇기 때문에 ArrayList는 굉장히 간편하지만 그만큼 성능이 Array나 List에
비해 더 많이 저하된다.
4. Dictionary란?
Dictionary는 인덱스 번호를 대신하여 사용하는 Key 와 값을 불러올 Value를
같이 사용하는 연관 배열이다. 요약하자면 Key값을 이용하여 Value 값을 불러
올 수 있는 배열이다. 주의할 점은 Key값은 중복되어 들어갈 수 없다.
위 코드에서는 string, string으로 사용됐지만 자신이 원하는 타입을 넣어서 사용하면 된다.
데이터를 넣는 부분의 원형은 TKey, TValue인 제네릭 값이기 때문이다.
Dictionary는 특히 검색 값이 빠른 장점이 있는데 이유는 해시 테이블을 사용하기 때문이다.
Key값을 저장할 때 해시 함수를 적용하여 고유한 index를 만들 기 때문에 Key를 알면
해시 함수를 통해 바로 index를 알 수 있다. 그렇기 때문에 데이터를 찾을 때 O(1) 의 평균
시간복잡도로 삭제, 조회가 가능하다.
요약
배열은 고정된 크기를 가진 동일한 데이터 타입의 컬렉션입니다.
리스트는 가변의 크기를 가진 동일한 데이터 타입의 컬렉션입니다.
어레이리스트는 가변의 크기를 가지지만 서로 다른 타입의 데이터 저장이 가능합니다.
딕셔너리는 인덱스 번호 대신 Key값을 사용하여 Value값을 불러오는 연관 배열입니다.
딕셔너리 구현 방법은 해시 테이블을 이용하여 구현했습니다.
그렇기 때문에 Key값이 해시가 적용되어 들어가서 고유한 값을 가지기 때문에
Value 값을 O(1)의 속도로 삭제, 조회가 가능합니다.
'TIL > C#' 카테고리의 다른 글
[C#] 델리게이트 (0) | 2023.11.06 |
---|---|
[C#] 제네릭 (0) | 2023.11.02 |
[C#] 박싱과 언박싱 (0) | 2023.11.01 |
[C#] 가비지 컬렉션(Garbage Collection) (0) | 2023.10.31 |
[C#] 가비지 컬렉터 회피 전략 (0) | 2023.10.30 |