---
description: 인접한 메모리에 원소들을 일렬로 저장하는 데이터 구조
---

# Array

## 특징

* 인접한 메모리 위치에 동일한 유형의 여러 데이터들을 함께 저장하는 방식
* 배열의 첫 번째 요소는 일반적으로 배열 이름이다.
* 배열의 첫 번째 요소가 있는 메모리 위치에 오프셋을 추가하여 쉽게 각 요소의 위치를 ​​계산할 수 있다.
* 배열 생성 시 적절한 크기의 메모리 공간에 정적으로 할당해주기 때문에, 해당 메모리 공간의 다음 부분이 비어있는지 확신할 수 없다. 따라서 배열의 크기를 변경할 수 없도록 한다.
* 데이터가 연속적으로 저장되어 있으므로 공간 지역성 덕분에 캐시 메모리에 저장 시 높은 Cache Hit Rate를 가질 수 있다.
* 삽입과 삭제의 경우 O(N)의 시간 복잡도를 갖는다.
* 원소에 접근할 때는 O(1)의 시간 복잡도를 갖는다.

<figure><img src="https://946524419-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZqOTWctN1y9hEXEl4sKd%2Fuploads%2FbmBKPEZs2zkU01c4Wwev%2Fimage.png?alt=media&#x26;token=93f4b9b4-d74e-41d8-8e93-4191fc83c2cf" alt=""><figcaption></figcaption></figure>

## 자바의 배열

* 리스트와 달리 primitive 타입, 객체 타입 모두 배열로 선언 가능하다.
  * ex) `Integer[] arr = new Integer[100]; int[] arr = new int[100];`

#### 배열 기본 동작

```java
// 선언
// 직접 원소를 넣은 채로 선언하거나, 배열의 길이만 먼저 선언할 수 있다.
int[] odds = {1, 3, 5, 7, 9};
String[] weeks = new String[7];

// 값 설정
weeks[1] = "Monday";

// 값 접근 (인덱스 기반만 가능)
System.out.println(weeks[5]);

// 배열 길이 조회
System.out.println(odds.length);

// 배열 내용 채우기(덮어쓰기)
Arrays.fill(odds, Integer.MIN_VALUE);
```

#### 배열 정렬

```java
// 오름차순 정렬
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); // [0,1,2,3,4]

// 내림차순 정렬
Arrays.sort(arr, Collections.reverseOrder());
```

#### 배열 비교

```java
boolean isSame = Arrays.equals(arr1, arr2);
```

#### 배열 <-> 리스트

```java
// 배열 -> 리스트
String[] arr = {"a", "b", "c"};
Arrays.asList(arr);

// 리스트 -> 배열
List<Integer> list = new ArrayList<>();
int[] arr = list.stream().mapToInt(Integer::intValue).toArray();

List<String> list = new ArrayList<>();
String[] arr = list.toArray(new String[list.size()]);
```
