Java시작과 문법

배열 기초

Java 배열이 고정 길이인 이유, `length` 필드와 `Arrays` 유틸리티 사용법, 배열 대신 컬렉션을 써야 하는 시점을 정리합니다.

마지막 수정 2026년 3월 27일

기본 패턴

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, 나머지는 0

Arrays 유틸리티 — 정렬, 검색, 비교

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