일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 직렬화
- 프로그래머스
- inputsystem
- BGM
- 람다식
- c#
- 유니티
- 비선형자료구조
- Generic
- 스택
- 코루틴
- 유한상태머신
- ObjectPool
- InputManager
- 효과음
- skybox
- LINQ
- 스파르타내일배움캠프
- 인터페이스
- soundmanager
- 자료구조
- FSM
- unity
- 메서드
- invokec#events
- 배열
- delegate
- script
- 장애물달리기
- UI
- Today
- Total
Unity 개발일지
[C#] 정적배열(Array)과 동적배열(Dynamic Array) 본문
일반적으로 "배열"이라 함은 정적배열을 의미하고 "동적 배열"이라고 명확하게 이야기해야 "동적 배열"을 뜻한다.
오늘은 이 둘의 차이와 동적배열인 ArrayList와 List를 알아보자.
정적배열(Array)
연관된 데이터를 메모리상에 연속적이며 순차적으로, 미리 할당된 크기만큼 저장하는 자료구조이다.
인덱스만 알고 있으면 조회를 빠르게 할 수 있어 조회를 자주해야하는 작업에서 Array 자료구조를 많이 사용한다.
Array를 선언할 때 크기를 미리 정해야 되므로 메모리낭비나 추가적인 overhead가 발생할 수 있다.
동적배열(Dynamic Array)
저장 공간이 가득 차는 경우 자동적으로 사이즈를 늘려 데이터를 추가/저장 할 수 있는 유동적인 자료구조.
저장공간(Capacity)를 넘어서는 경우 기존의 size보다 더 큰 Array를 선언하여 데이터를 옮긴 뒤, 기존의 Array는 삭제한다.
대표적인 예로 ArrayList와 List<T>가 있으며 글 작성일 기준 ArrayList보다는 List<T> 사용을 권장하고있다.
그러므로 List<T>에 대해서 알아보도록 하겠다.
List<T> 클래스
List<T>는 배열요소가 T타입인 Generic으로 동적 배열을 지원하는 클래스이다.
.NET Generic 클래스들은 System.Colloection.Generic 네임스페이스 안에 있으며 List클래스는 내부적으로 배열을 가지고 있고, 동일한(Homogeneous) 타입의 데이터를 저장한다. 만일 Capacity가 부족하면 내부적으로 배열을 2배로 늘려 동적으로 배열을 확장한다. ArrayList와는 다르게 캐스팅을 할 필요가 없으며, 박싱 / 언박싱의 문제를 발생시키지 않는다.
리스트는 List<자료형> list = new List<자료형>();의 형태로 선언하며 이후 중괄호로 값을 지정해줄 수 있다.
Add와 Remove로 값을 더하고 빼줄 수 있으며 Add는 리스트의 가장 마지막으로, Remove는 리스트 앞에서부터 시작해서 3이라는 값을 처음만났을 때 이 인덱스 값을 제거한다. 위에서는 1, 2, 4, 5만 남게 되는 것이다.
리스트에 저장된 값을 알고싶으면 for문과 foreach문을 이용하며 foreach문의 선호도가 높은편이다.
배열의 개수는 Count로 알 수 있다.
리스트에서 2라는 값을 처음 만났을 때 이 인덱스 값을 반환하고, 없으면 -1을 반환한다.
List의 정렬과 초기화
List사용시 유의할 점
1. Capacity를 넘어가면 재할당 후 복사하므로 비용이 크다.(반복문에서 빈번하게 일어날 경우)
2. Capacity가 증가될 시 Count에 따라 기하 급수적으로 커질 수 있다.
3. Capacity * T.Size 만큼 메모리를 잡고 있으므로 낭비가 크다.
List의 크기를 정해놨다면, List의 크기가 커질 것으로 예상된다면 Capacity 프로퍼티를 만드는 것도 좋은 방법이 될것이다.
'C#' 카테고리의 다른 글
[C#] Newtonsoft.Json 을 이용하여 콘솔창에서 Save/Load 기능 만들기 (1) | 2024.05.02 |
---|---|
[C#] Dictionary(딕셔너리) 사용법 (0) | 2024.04.30 |
[C#] 정적(Static) 필드와 메서드 (2) | 2024.04.26 |
[C#] 무한루프를 이용해 잘못된 입력을 받았을 때 메세지 띄우기 (0) | 2024.04.25 |
[C#] 인터페이스(Interface)와 추상(Abstract)클래스 (0) | 2024.04.24 |