기본 패턴
java
// 배열 선언과 초기화
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; // 수정 가능설명
배열은 왜 고정 길이인가
Java 배열은 생성 시 연속된 메모리 블록을 할당합니다. 이 메모리 블록의 크기는 생성할 때 결정되며, 이후에 크기를 바꾸려면 새 배열을 만들고 복사해야 합니다. 이것이 배열이 고정 길이인 근본적인 이유입니다.
인덱스로 O(1)에 접근할 수 있는 것은 이 연속 메모리 덕분입니다. 반면 크기 변경 비용이 크므로, 크기가 자주 달라지는 데이터에는 ArrayList처럼 내부적으로 배열을 재할당하는 컬렉션이 더 적합합니다.
java
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는 배열을 다루는 정적 메서드들을 제공합니다. 직접 반복문을 쓰는 것보다 의도가 명확하고 최적화된 구현을 사용합니다.
java
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 호환성이 필요한 경우에 씁니다.
java
// 배열이 적합한 경우 — 크기 고정, 기본 타입, 성능
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");빠른 정리
| 상황 | 선택 |
|---|---|
| 크기가 고정된 데이터 | 배열 |
| 크기가 자주 바뀌는 목록 | ArrayList |
| 배열 길이 확인 | arr.length (필드, ()없음) |
| 배열 내용 비교 | Arrays.equals(a, b) |
| 배열 출력 | Arrays.toString(arr) |
| 정렬 | Arrays.sort(arr) |
주의할 점
배열 인덱스는 0부터 시작하고, length는 필드입니다. 범위를 벗어나면 ArrayIndexOutOfBoundsException, ()를 붙이면 컴파일 오류가 납니다.
java
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