-
카테고리
-
세부 분야
게임 프로그래밍
-
해결 여부
해결됨
배열, 동적 배열의 단점과 C#의 단점 해결법
22.05.03 17:25 작성 조회수 905
1
안녕하세요. 공부하던 중 일부 의야한것이 있어 질문 드립니다. 좀 애매모호한 의문이긴 합니다만 기왕 배우는것 확실하게 알고 싶습니다.
강의에서 배운바로는 배열의 단점은 "방(메모리)의 크기 수정이 불가능" 동적 배열(리스트)의 단점은 "이사 비용의 부담, 중간 삽입과 삭제 어려움" 이라 이해했습니다.
그런데 Resize<T>로 배열의 크기 수정. Insert, RemoveAt으로 리스트의 중간 삽입과 삭제가 쉽게 가능했습니다. 그리고 동적 배열의 이사 횟수를 줄이기 위해 "여유분을 두고 할당한다" 라고 하셨는데 찾아봐도 List<T>에 여유분을 할당하는 기능을 찾을수가 없었습니다.
이러다보니 강의에서 배운 자료구조와 C#의 자료구조 사이에 일종의 괴리감이 생기는것 같습니다. 제가 제시한 단점 해결법(Resize, Insert, RemoveAt)들은 사용이 편할뿐 세부적으론 부담이 심한것인가요? 그리고 리스트에 여유분을 할당하는것은 직접 리스트를 구현하는 경우에만 가능한 것인가요? 답변 부탁드립니다.
답변을 작성해보세요.
2
Rookiss
지식공유자2022.05.03
1. 배열에도 Resize가 있는데?
https://stackoverflow.com/questions/9610232/resizing-array-performance
비효율적인 방식입니다. 위 링크 답변처럼 Resize가 필요하면 List를 쓰는게 좋습니다.
배열을 통으로 날리고 다시 만들어서 데이터를 다시 복사하는 것이라 당연히 성능적으로 느립니다.
2. Capacity입니다. 숨겨져 있을 뿐이죠.
https://docs.microsoft.com/ko-kr/dotnet/api/system.collections.generic.list-1.capacity?view=net-6.0
자료구조는 언어에 종속적인 개념이 아닙니다.
C++의 배열 = C#의 배열
C++의 vector = C#의 List
인 것이고 언어와 무관하게 배열, 동적배열의 특징은 100% 동일합니다.
설령 특정 언어에서 Resize, InsertAt 등을 제공한다고 해서 그것이 빠르다는 의미가 아닙니다.
가령 C++에서는 질문자처럼 모르고 사용하는 것을 방지하기 위해
느린 버전은 아예 함수로 제공하지 않는 경우가 많습니다.
답변 1