배열(Array)
배열은 프로그래밍에서 가장 기본적이면서도 중요한 선형 자료구조이다.
데이터가 메모리상에 연속적으로 배치된다는 특징 덕분에 매우 빠른 접근 속도를 자랑하지만, 삽입과 삭제 작업에서는 효율성이 떨어진다.
배열의 정의와 특징
배열은 동일한 데이터 타입의 요소들을 메모리상의 연속적인 공간에 순차적으로 저장하는 자료구조이다.
각 요소는 고유한 인덱스(Index) 를 통해 식별된다.
주요 특징
연속적 메모리 배치: 요소들이 메모리상에 나란히 붙어 있어, 시작 주소와 인덱스만 알면 즉시 데이터에 접근할 수 있다.
고정 크기: 일반적으로 배열은 선언 시 크기가 결정되며, 이후에는 크기를 변경하기 어렵다.
임의 접근(Random Access): 인덱스를 사용하여 어느 위치의 데이터든 즉시 찾아갈 수 있다.
| 연산 | 시간 복잡도 | 설명 |
|---|---|---|
| 접근 (Access) | O(1) | 인덱스를 통해 즉시 접근 가능 |
| 탐색 (Search) | O(n) | 특정 값을 찾기 위해 전체를 순회해야 함 |
| 삽입 (Insertion) | O(n) | 데이터를 밀어내야 하므로 최악의 경우 n번 연산 필요 |
| 삭제 (Deletion) | O(n) | 데이터를 당겨와야 하므로 최악의 경우 n번 연산 필요 |
배열 인스턴스 메서드
요소 추가 및 삭제 (원본 배열 수정)
| 메서드 | 설명 (반환 값) | 예제 코드 |
|---|---|---|
| push() | 끝에 요소 추가 ➡️ 변경된 배열의 새로운 length 반환 | const arr = [1, 2]; arr.push(3); ➡️ 3 |
| pop() | 끝 요소 제거 ➡️ 제거된 요소 반환 (빈 배열이면 undefined) | const arr = [1, 2, 3]; arr.pop(); ➡️ 3 |
| unshift() | 앞에 요소 추가 ➡️ 변경된 배열의 새로운 length 반환 | const arr = [1, 2]; arr.unshift(0); ➡️ 3 |
| shift() | 앞 요소 제거 ➡️ 제거된 요소 반환 (빈 배열이면 undefined) | const arr = [1, 2, 3]; arr.shift(); ➡️ 1 |
| splice() | 특정 위치 요소 삭제/추가 ➡️ 제거한 요소를 담은 배열 반환 | const arr = [1, 2, 3]; arr.splice(1, 1, 9); ➡️ [2] |
| sort() | 배열 요소를 정렬 ➡️ 정렬된 원본 배열의 참조 반환 | const arr = [3, 1, 2]; arr.sort(); ➡️ [1, 2, 3] |
| reverse() | 배열 순서를 반전 ➡️ 반전된 원본 배열의 참조 반환 | const arr = [1, 2, 3]; arr.reverse(); ➡️ [3, 2, 1] |
배열 가공 및 변형 (새 배열 반환)
| 메서드 | 설명 (반환 값) | 예제 코드 |
|---|---|---|
| map() | 각 요소를 변환하여 ➡️ 새로운 배열 반환 | const arr = [1, 2]; arr.map(x => x * 10); ➡️ [10, 20] |
| filter() | 조건에 맞는 요소만 모아 ➡️ 새로운 배열 반환 (없으면 빈 배열 []) | const arr = [1, 2, 3]; arr.filter(x => x > 5); ➡️ [] |
| concat() | 여러 배열을 하나로 합쳐 ➡️ 새로운 배열 반환 | const arr = [1]; arr.concat([2, 3]); ➡️ [1, 2, 3] |
| flat() | 중첩 배열을 평탄화하여 ➡️ 새로운 배열 반환 | const arr = [1, [2, 3]]; arr.flat(); ➡️ [1, 2, 3] |
| join() | 배열을 하나로 합친 ➡️ 새로운 문자열 반환 | const arr = [1, 2, 3]; arr.join("-"); ➡️ "1-2-3" |
검색 및 판별
| 메서드 | 설명 (반환 값) | 예제 코드 |
|---|---|---|
| find() | 조건에 맞는 첫 요소 반환 ➡️ 해당 요소 값 반환 (없으면 undefined) | const arr = [1, 2, 3]; arr.find(x => x > 5); ➡️ undefined |
| findIndex() | 조건에 맞는 첫 인덱스 반환 ➡️ 인덱스 숫자 반환 (없으면 -1) | const arr = [1, 2, 3]; arr.findIndex(x => x > 5); ➡️ -1 |
| includes() | 특정 요소 포함 여부 확인 ➡️ true / false 반환 | const arr = [1, 2, 3]; arr.includes(2); ➡️ true |
| indexOf() | 특정 요소의 인덱스 반환 ➡️ 인덱스 숫자 반환 (없으면 -1) | const arr = [1, 2, 3]; arr.indexOf(9); ➡️ -1 |
| some() | 하나라도 조건을 만족하는지 ➡️ true / false 반환 | const arr = [1, 2, 3]; arr.some(x => x > 2); ➡️ true |
| every() | 모든 요소가 조건을 만족하는지 ➡️ true / false 반환 | const arr = [1, 2, 3]; arr.every(x => x > 0); ➡️ true |
| at() | 인덱스로 요소 접근 ➡️ 해당 요소 값 반환 (없으면 undefined) | const arr = [1, 2, 3]; arr.at(-1); ➡️ 3 |
최신 불변성 메서드 (ES2023+)
| 메서드 | 설명 (반환 값) | 예제 코드 |
|---|---|---|
| toSorted() | 정렬된 ➡️ 새로운 배열 반환 | const arr = [3, 1, 2]; arr.toSorted(); ➡️ [1, 2, 3] |
| toReversed() | 순서가 반전된 ➡️ 새로운 배열 반환 | const arr = [1, 2, 3]; arr.toReversed(); ➡️ [3, 2, 1] |
| toSpliced() | 변경 사항이 적용된 ➡️ 새로운 배열 반환 | const arr = [1, 2, 3]; arr.toSpliced(1, 1, 9); ➡️ [1, 9, 3] |
| with() | 특정 인덱스가 교체된 ➡️ 새로운 배열 반환 | const arr = [1, 2, 3]; arr.with(1, 9); ➡️ [1, 9, 3] |
반복 및 누적
| 메서드 | 설명 (반환 값) | 예제 코드 |
|---|---|---|
| forEach() | 각 요소에 대해 함수 실행 ➡️ undefined 반환 | const arr = [1, 2]; arr.forEach(x => console.log(x)); ➡️ undefined |
| reduce() | 요소를 순회하며 하나의 값으로 누적 ➡️ 최종 누적 계산 결과값 반환 | const arr = [1, 2, 3]; arr.reduce((acc, cur) => acc + cur, 0); ➡️ 6 |
배열 회전
배열의 회전이란 배열의 요소들을 일정한 방향(시계 방향 또는 반시계 방향)으로 밀어내어 위치를 재배치하는 과정을 말한다.
시계 방향 회전 (Right Rotation)
배열의 모든 요소를 오른쪽으로 한 칸씩 이동시킨다.
마지막 요소는 배열의 첫 번째 자리로 이동한다.

javascript
const arr = [1, 2, 3, 4, 5, 6];
const rotate = 2;
function rightRotate(arr, count) {
const size = arr.length;
// count 만큼 회전
for (let i = 0; i < count; i++) {
// 마지막 값 저장
const last = arr[size - 1];
// 뒤에서 앞으로 요소 이동
for (let j = size - 1; j > 0; j--) {
arr[j] = arr[j - 1];
}
// 첫 번째 위치에 마지막 값 넣기
arr[0] = last;
}
return arr;
}
rightRotate(arr, rotate);반시계 방향 회전 (Left Rotation)
배열의 모든 요소를 왼쪽으로 한 칸씩 이동시킨다. 첫 번째 요소는 배열의 마지막 자리로 이동한다. 
javascript
const arr = [1, 2, 3, 4, 5, 6];
const rotate = 2;
function leftRotate(arr, count) {
const size = arr.length;
// count 만큼 회전
for (let i = 0; i < count; i++) {
// 첫 번째 값 저장
const first = arr[0];
// 앞에서 뒤로 요소 이동
for (let j = 0; j < size - 1; j++) {
arr[j] = arr[j + 1];
}
// 마지막 위치에 첫 번째 값 넣기
arr[size - 1] = first;
}
return arr;
}
leftRotate(arr, rotate);