Quick Reference
// 배열 선언과 초기화
int[] numbers = {10, 20, 30, 40, 50};
String[] names = new String[3]; // 기본값 null로 초기화
// 길이 확인 — length 필드 (메서드 아님)
System.out.println(numbers.length); // 5
// 인덱스로 접근
System.out.println(numbers[0]); // 10
numbers[1] = 99; // 수정 가능배열은 생성할 때 길이가 고정되는 index 기반 저장소입니다. primitive 값을 고정 크기로 다루거나 index 접근이 핵심일 때 쓰고, 크기가 자주 달라지면 ArrayList를 먼저 검토합니다.
문법
어떤 자료구조를 먼저 고르면 되나
| 상황 | 먼저 떠올릴 것 |
|---|---|
| 크기 고정 | 배열 |
| 크기 변경 빈번 | ArrayList |
| 길이 확인 | arr.length |
| 배열 유틸리티 | Arrays.sort, Arrays.equals, Arrays.copyOf |
고정 길이와 접근 계약
Java 언어가 보장하는 것은 배열이 생성 시 정해진 length를 가지며 유효한 index로 원소에 접근한다는 점입니다. JVM이 모든 구현과 상황에서 물리적으로 연속된 메모리 배치를 언어 계약으로 공개하는 것은 아닙니다. 그래서 배열을 고를 때는 “연속 메모리”보다 고정 길이, primitive 저장, index 접근이라는 API 성질을 기준으로 판단합니다.
크기를 늘리려면 다른 길이의 배열을 만들고 값을 복사해야 합니다. 크기가 자주 달라지는 데이터에는 ArrayList처럼 확장 정책을 가진 컬렉션이 더 적합합니다. index 접근은 일반적으로 상수 시간으로 기대할 수 있지만, 성능 설명은 특정 JVM과 workload에서 측정해야 합니다.
int[] arr = new int[3]; // 크기 3 고정, 기본값 0
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
// arr[3] = 40; — ArrayIndexOutOfBoundsException
// 배열 크기를 늘리려면 새 배열로 복사
int[] larger = Arrays.copyOf(arr, 6); // 크기 6, 나머지는 0Arrays 유틸리티 — 정렬, 검색, 비교
java.util.Arrays는 배열을 다루는 정적 메서드들을 제공합니다. 직접 반복문을 쓰는 것보다 의도가 명확하고 최적화된 구현을 사용합니다.
int[] nums = {5, 3, 1, 4, 2};
// 정렬 — 원본 배열을 변경
Arrays.sort(nums); // [1, 2, 3, 4, 5]
// 이진 탐색 — 정렬된 배열에서만 동작
int idx = Arrays.binarySearch(nums, 3); // 2
// 배열 내용 비교 (== 는 참조 비교)
int[] copy = {1, 2, 3, 4, 5};
System.out.println(nums == copy); // false
System.out.println(Arrays.equals(nums, copy)); // true
// 배열 내용 출력
System.out.println(Arrays.toString(nums)); // [1, 2, 3, 4, 5]배열 vs 컬렉션 — 선택 기준
배열은 크기가 고정되고 기본 타입(int[], double[])을 직접 담을 수 있습니다. 컬렉션(List, Set 등)은 크기가 동적이고 다양한 연산(추가, 삭제, 검색)이 편리하지만 기본 타입은 박싱됩니다.
실무에서는 대부분 컬렉션을 사용하고, 배열은 성능이 중요한 저수준 처리나 API 호환성이 필요한 경우에 씁니다.
// 배열이 적합한 경우 — 크기 고정, 기본 타입, 성능
byte[] buffer = new byte[1024]; // I/O 버퍼
int[] matrix = new int[rows * cols]; // 행렬 연산
// 컬렉션이 적합한 경우 — 동적 크기, 편의 API
List<String> names = new ArrayList<>(); // 크기 변경 빈번
names.add("Kim");
names.remove("Kim");다차원 배열은 “행마다 길이가 다른 배열의 배열”도 만들 수 있습니다. 직사각형 행렬만 가정하면 index와 초기화 실수가 생깁니다.
int[][] jagged = {
{1, 2},
{3, 4, 5}
};
int last = jagged[1][2]; // 5체크포인트
| 상황 | 선택 |
|---|---|
| 크기가 고정된 데이터 | 배열 |
| 크기가 자주 바뀌는 목록 | ArrayList |
| 배열 길이 확인 | arr.length (필드, ()없음) |
| 배열 내용 비교 | Arrays.equals(a, b) |
| 배열 출력 | Arrays.toString(arr) |
| 정렬 | Arrays.sort(arr) |
주의할 점
배열 인덱스는 0부터 시작하고, length는 필드입니다. 범위를 벗어나면 ArrayIndexOutOfBoundsException, ()를 붙이면 컴파일 오류가 납니다.
int[] arr = {10, 20, 30};
// ❌ 흔한 실수들
arr.length(); // 컴파일 오류 — length는 필드, 메서드 아님
arr[3] = 40; // ArrayIndexOutOfBoundsException — 유효 인덱스: 0, 1, 2
arr[-1]; // ArrayIndexOutOfBoundsException
// ✅ 올바른 접근
int len = arr.length; // 3
int last = arr[len - 1]; // 30 — 마지막 원소참고 링크
2 sources