1. 소개
Java의 배열은 강력한 도구지만 기본 문법만으로는 금방 반복 작업에 부딪힙니다. 이를 도와주는 것이 java.util.Arrays — 배열 작업을 위한 정렬, 복사, 비교, 서식화된 출력 등 다양한 정적 메서드 모음입니다. 인스턴스를 만들 필요가 없습니다 — 모든 메서드는 정적이며 클래스 이름으로 호출합니다.
메서드를 사용하려면 파일 맨 위에 import를 추가하세요:
import java.util.Arrays;
import를 잊으면 컴파일러가 Arrays를 “찾을 수 없음”이라고 보고합니다 — 버그가 아니라 import가 없는 상태에서의 정상 동작입니다.
2. 배열 정렬: Arrays.sort
Arrays.sort는 어떻게 동작하나
문법
Arrays.sort(massiv);
Arrays.sort(massiv, nachal’nyyIndeks, konechnyyIndeks);
이 메서드는 “제자리에서” 정렬합니다 — 원본 배열을 변경하며 새 배열을 반환하지 않습니다. 원래 순서를 보존하고 싶다면 먼저 배열을 복사하세요.
예제: 정수 배열 정렬
int[] scores = {5, 2, 9, 1, 7};
Arrays.sort(scores); // 오름차순으로 정렬
System.out.println("정렬된 배열: " + Arrays.toString(scores));
// 출력: [1, 2, 5, 7, 9]
예제: 문자열 배열 정렬
String[] names = {"Vasya", "Petya", "Anya", "Igor"};
Arrays.sort(names);
System.out.println(Arrays.toString(names));
// [Anya, Igor, Petya, Vasya]
중요: 문자열은 사전식(lexicographic)으로, 숫자는 오름차순으로 정렬됩니다.
배열의 일부만 정렬
int[] arr = {7, 5, 3, 1, 9, 8};
Arrays.sort(arr, 1, 4); // 인덱스 1부터 3까지 포함해서 정렬합니다(4는 포함되지 않음)
System.out.println(Arrays.toString(arr));
// [7, 1, 3, 5, 9, 8]
특징
- 제자리 정렬: 원본 배열이 바뀝니다.
- 숫자는 오름차순, 문자열은 알파벳(사전식) 순서.
- 복잡한 객체는 Comparator를 받는 오버로드를 사용하세요.
3. 배열 채우기: Arrays.fill
문법
Arrays.fill(massiv, znachenie);
Arrays.fill(massiv, nachal’nyyIndeks, konechnyyIndeks, znachenie);
이 메서드는 전체 또는 지정된 부분을 동일한 값으로 채웁니다.
int[] marks = new int[5];
Arrays.fill(marks, 3); // 모든 요소가 이제 3
System.out.println(Arrays.toString(marks)); // [3, 3, 3, 3, 3]
배열의 일부 채우기
int[] arr = new int[10];
Arrays.fill(arr, 2, 5, 7); // 인덱스 2부터 4까지 채웁니다(5는 포함되지 않음)
System.out.println(Arrays.toString(arr));
// [0, 0, 7, 7, 7, 0, 0, 0, 0, 0]
문자열 배열 채우기
String[] guests = new String[4];
Arrays.fill(guests, "비어 있음");
System.out.println(Arrays.toString(guests)); // [비어 있음, 비어 있음, 비어 있음, 비어 있음]
4. 배열 복사: Arrays.copyOf и Arrays.copyOfRange
Arrays.copyOf
문법
Arrays.copyOf(iskhodnyyMassiv, novayaDlina);
새 배열을 만들어 원본의 요소를 복사합니다. 새 길이가 원본보다 크면 ‘뒤쪽’은 기본값으로 채워집니다 (0 — int, 참조 타입은 null).
int[] original = {1, 2, 3};
int[] copy = Arrays.copyOf(original, 5);
System.out.println(Arrays.toString(copy)); // [1, 2, 3, 0, 0]
길이를 줄이기
int[] shortCopy = Arrays.copyOf(original, 2);
System.out.println(Arrays.toString(shortCopy)); // [1, 2]
Arrays.copyOfRange
문법
Arrays.copyOfRange(iskhodnyyMassiv, nachal’nyyIndeks, konechnyyIndeks);
int[] arr = {10, 20, 30, 40, 50};
int[] mid = Arrays.copyOfRange(arr, 1, 4); // 인덱스 1부터 3까지 복사
System.out.println(Arrays.toString(mid)); // [20, 30, 40]
5. 배열 비교: Arrays.equals и Arrays.deepEquals
Java에서는 배열을 ==로 비교하면 안 됩니다 — 이는 내용이 아니라 참조를 비교합니다:
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(a == b); // false!
내용은 어떻게 비교하나요?
Arrays.equals(massiv1, massiv2);
Arrays.deepEquals(matritsa1, matritsa2);
System.out.println(Arrays.equals(a, b)); // true
1차원 배열에는 Arrays.equals, 2차원 이상에는 Arrays.deepEquals를 사용하세요.
예제: 2차원 배열 비교
int[][] matrix1 = {{1, 2}, {3, 4}};
int[][] matrix2 = {{1, 2}, {3, 4}};
System.out.println(Arrays.equals(matrix1, matrix2)); // false!
System.out.println(Arrays.deepEquals(matrix1, matrix2)); // true
6. 배열을 보기 좋게 출력하기: Arrays.toString и Arrays.deepToString
배열을 직접 출력하면 읽기 어려운 문자열이 나옵니다:
int[] arr = {1, 2, 3};
System.out.println(arr); // [I@7a81197d
문법
Arrays.toString(massiv);
Arrays.deepToString(matritsa);
System.out.println(Arrays.toString(arr)); // [1, 2, 3]
int[][] matrix = {{1, 2}, {3, 4}};
System.out.println(Arrays.deepToString(matrix)); // [[1, 2], [3, 4]]
7. Arrays 클래스 사용 시 흔한 실수
오류 №1: 배열을 통해 비교하려 함 ==
배열은 객체이며, ==는 참조만 비교합니다. 값이 같아도 결과는 false가 됩니다. 1차원 배열에는 Arrays.equals, 다차원 배열에는 Arrays.deepEquals를 사용하세요.
오류 №2: 정렬이 배열을 “제자리에서” 바꾼다는 사실을 잊음
원래 순서가 필요하다면 먼저 Arrays.copyOf로 복사본을 만든 뒤, 그 복사본을 정렬하세요. 그렇지 않으면 원본의 순서를 잃습니다.
오류 №3: Arrays.fill과 Arrays.copyOfRange의 경계를 잘못 이해함
이 메서드들은 반개구간을 사용합니다: 오른쪽 인덱스는 포함되지 않습니다. 예를 들어, Arrays.fill(arr, 2, 5, 9)는 인덱스 2, 3, 4를 채우며, 인덱스 5의 요소는 건드리지 않습니다.
오류 №4: 배열을 그대로 출력하려 함
System.out.println(arr)을 호출하면 기술적 표현이 출력됩니다. 1차원 배열은 Arrays.toString, 다차원 배열은 Arrays.deepToString을 사용하세요.
오류 №5: 다차원 배열을 통해 비교 Arrays.equals
이 메서드는 최상위 수준(내부 배열에 대한 참조)만 비교합니다. 내용 비교에는 Arrays.deepEquals를 사용하세요.
GO TO FULL VERSION