배열: 동일한 자료형를 가지고 연속된 공간에 저장되는 데이터(element)의 집합
배열의 길이는 고정이며 변경할 수 없다.
new
연산자(동적 메모리 할당 연산자)로 생성된 데이터 → heapint[] numbers
numbers = new int[3]
// 1. 초기값으로 선언 및 생성
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; // 1차원 배열
// 2. 배열 크기로 선언 및 생성
String[][] sentences = new String[3][10]; // 2차원 배열
// 3. 선언 후 초기화, 값의 개수에 의해 배열의 길이 자동 결정
Object[] objects;
objects = new Object[] {new Object(), new Object()};
Indexing(원소의 일련번호)으로 배열의 원소에 무작위 접근(random access)이 가능하다.
int[] numbers = new int[3]; // 자료형의 기본값으로 초기화됨
for (int i = 0; i < numbers.length; i++) {
numbers[i] = i * i; // 원하는 값으로 저장(덮어쓰기)
}
int n = numbers[2]; // index 2로 접근
배열의 모든 인덱스에 접근해야 한다.
[1, 2, 3, 4, 5]의 2번째 자리(index = 1)에 0을 삽입하고 싶다.
특정 원소를 삽입할 때 배열의 마지막 원소부터 뒤로 이동한다.
index = 4 → [1, 2, 3, 4, 4]
index = 3 → [1, 2, 3, 3, 4]
index = 2 → [1, 2, 2, 3, 4] → [1, 0, 2, 3, 4]
[1, 2, 3, 4, 5]의 원소 2(index = 1)를 삭제하고 싶다.
삭제하고자하는 원소의 index로 먼저 이동
index = 1 → [1, 3, 3, 4, 5]
index = 2 → [1, 3, 4, 4, 5]
index = 3 → [1, 3, 4, 5, 5]
특정 값 검색
배열의 원소값이 정렬되어있지 않은 경우 첫번째 원소부터 순회하면서 검색하고자 하는 값과 비교해야 한다.
// 1. for문
for (int i = 0; i < numbers.length; i++) {
System.out.print(numbers[i] + ", ");
}
// 2. Arrays method
System.out.println(Arrays.toString(numbers));
연결 리스트: 데이터와 포인터를 가진 노드(node)들이 한 줄로 연결된 자료구조
LinkedList objects = new LinkedList(); // 타입 설정 X, Object로 선언
LinkedList<Integer> numbers = new LinkedList<>(); // 생성시 자료형 생략 가능
LinkedList<String> sentences = new LinkedList<>(Arrays.asList("ab", "cd", "ef"));
sentences.add("gh");
sentences.remove("cd"); // value 기반 삭제
sentences.remove(0); // index 기반 삭제
특정 원소에 접근하기 위해 첫 노드부터 순차 접근(sequential access)이 필요하다. random access 접근 불가.
Array(배열)처럼 삽입, 삭제시 전체 인덱스가 밀리거나 당겨지지 않으며, 앞뒤 노드만 영향을 받는다.
변경 지점 | 시간 복잡도 |
---|---|
search | O(n) |
first, last 삽입/삭제 | O(1) |
index 기반 삽입/삭제 | O(n) |
clear | O(n) |
index를 기반으로 삽입/삭제를 하고자 한다면 원하는 위치를 찾는 검색 과정이 필요하다.
자바의 경우 배열/리스트의 크기를 벗어나거나 음수 인덱스에 접근하려할 경우 ArrayIndexOutOfBoundsException
을 런타임에 발생시킨다.
int[] arrayNumbers = new int[n]; // index: 0 ~ n-1
// int errorIndexNumber = arrayNumbers[n];
List<Integer> listNumbers = new ArrayList<>();
// listNumbers.get(0);