Java

[Java] 자바 Arrays 클래스: 배열 다루기

yujinius 2024. 5. 6. 18:28

안녕하세요! 이번 포스팅에서는 자바 프로그래밍에서 배열을 다루는 데 유용한 Arrays 클래스에 대해 알아보겠습니다.

Arrays 클래스란?

Arrays 클래스는 java.util 패키지에 포함되어 있으며, 다양한 배열 관련 유틸리티 메서드를 제공하여 배열을 효율적으로 조작할 수 있게 해줍니다.

주요 기능은 다음과 같습니다:

  • 배열 정렬
  • 배열 복사
  • 배열 비교
  • 배열 검색
  • 배열 출력 등

이제 Arrays 클래스의 주요 메서드와 각 메서드의 사용법과 의미에 대해 알아보겠습니다.

 

Arrays 클래스 메서드 소개와 사용법

asList(T... a)

asList 메서드는 배열을 List로 변환합니다. 이를 통해 배열의 요소를 List로 쉽게 다룰 수 있습니다.

String[] words = {"apple", "banana", "orange"};
List<String> wordList = Arrays.asList(words);

binarySearch(array, key)

binarySearch 메서드는 이진 검색을 통해 특정 요소의 인덱스를 찾습니다. 이 메서드는 정렬된 배열에서만 사용할 수 있습니다.

// **binarySearch(char[] a, char key)**
char[] letters = {'a', 'b', 'c', 'd', 'e'};
int index = Arrays.binarySearch(letters, 'c');

//**binarySearch(int[] a, int key)**
int[] numbers = {1, 3, 5, 7, 9};
int index = Arrays.binarySearch(numbers, 5);

// **binarySearch(Object[] a, Object key)**
String[] words = {"apple", "banana", "orange", "strawberry", "watermelon"};
int index = Arrays.binarySearch(words, "banana");

// **binarySearch(T[] a, T key, Comparator<? super T> c)**
String[] words = {"apple", "banana", "orange", "strawberry", "watermelon"};
Comparator<String> lengthComparator = Comparator.comparingInt(String::length);
int index = Arrays.binarySearch(words, "banana", lengthComparator);

binarySearch(array, int fromIndex, int toIndex, key)

위의 binarySearch와 동일하지만, 배열의 일부분만을 대상으로 검색을 수행합니다.

fromIndex부터 toIndex까지의 범위 내에서 이진 검색을 수행합니다. 범위는 실제로 toIndex를 포함하지 않습니다. 이 메서드도 마찬가지로 찾고자 하는 요소가 배열에 존재한다면 해당 요소의 인덱스를 반환하고, 그렇지 않을 경우에는 삽입 포인트의 음수 값을 반환합니다.

// **binarySearch(char[] a, int fromIndex, int toIndex, char key)**
char[] letters = {'a', 'b', 'c', 'd', 'e'};
int index = Arrays.binarySearch(letters, 1, 4, 'c');

// **binarySearch(int[] a, int fromIndex, int toIndex, int key)**
int[] numbers = {1, 3, 5, 7, 9};
int index = Arrays.binarySearch(numbers, 0, 3, 5);

// **binarySearch(Object[] a, int fromIndex, int toIndex, Object key)**
String[] words = {"apple", "banana", "orange", "strawberry", "watermelon"};
int index = Arrays.binarySearch(words, 0, 3, "banana");

//**binarySearch(T[] a, int fromIndex, int toIndex, T key, Comparator<? super T> c)
//** 제네릭 배열에서 특정 요소를 검색하여 해당 요소의 인덱스를 반환합니다. 비교자(Comparator)를 지정하여 검색 기준을 설정할 수 있습니다.
****String[] words = {"apple", "banana", "orange", "strawberry", "watermelon"};
Comparator<String> lengthComparator = Comparator.comparingInt(String::length);
int index = Arrays.binarySearch(words, 0, 3, "banana", lengthComparator);

깊은 복사 (Deep copy)

copyOf()

copyOf 메서드는 배열을 0부터 원하는 길이만큼 복사하여 반환합니다.

// copyOf(char[] original, int newLength)
char[] original = {'a', 'b', 'c', 'd', 'e'};
char[] copiedArray = Arrays.copyOf(original, 3);

//**copyOf(T[] original, int newLength)**
Integer[] original = {1, 2, 3, 4, 5};
Integer[] copiedArray = Arrays.copyOf(original, 3);

// **copyOf(U[] original, int newLength, Class<? extends T[]> newType)**
Integer[] original = {1, 2, 3, 4, 5};
Number[] copiedArray = Arrays.copyOf(original, 3, Number[].class);

copyOfRange 메서드

copyOfRange 메서드는 배열의 일부분을 새로운 길이로 복사하여 반환합니다.

// **copyOfRange(int[] original, int from, int to)**
int[] original = {1, 2, 3, 4, 5};
int[] copiedArray = Arrays.copyOfRange(original, 1, 4);

// **copyOfRange(T[] original, int from, int to)**
Integer[] original = {1, 2, 3, 4, 5};
Integer[] copiedArray = Arrays.copyOfRange(original, 1, 4);

// **copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType)**
Integer[] original = {1, 2, 3, 4, 5};
Number[] copiedArray = Arrays.copyOfRange(original, 1, 4, Number[].class);

배열 비교 메서드

deepEquals, deepHashCode, deepToString 메서드

deepEquals 메서드는 두 배열이 내용물까지 동일한지 비교합니다. deepHashCode 메서드는 배열의 깊은 해시 코드를 반환합니다. deepToString 메서드는 배열의 내용물을 문자열로 반환합니다.

Integer[] array1 = {1, 2, 3};
Integer[] array2 = {1, 2, 3};
boolean isEqual = Arrays.deepEquals(array1, array2);
int hashCode = Arrays.deepHashCode(array1);
String arrayString = Arrays.deepToString(array1);

equals(a, b)

// **equals(char[] a, char[] a2)**
char[] array1 = {'a', 'b', 'c'};
char[] array2 = {'a', 'b', 'c'};
boolean isEqual = Arrays.equals(array1, array2);
//  **equals(int[] a, int[] a2)**
int[] array1 = {1, 2, 3};
int[] array2 = {1, 2, 3};
boolean isEqual = Arrays.equals(array1, array2);
// **equals(Object[] a, Object[] a2)**
Object[] array1 = {"apple", "banana", "orange"};
Object[] array2 = {"apple", "banana", "orange"};
boolean isEqual = Arrays.equals(array1, array2);

배열 채우기 메서드

fill(array, val), fill(array, int fromIndex, int toIndex, val)

//  **fill(int[] a, int val)**
int[] array = new int[5];
Arrays.fill(array, 10);

// **fill(int[] a, int fromIndex, int toIndex, int val)**
int[] array = new int[5];
Arrays.fill(array, 1, 3, 10);

배열 해시 코드 메서드

hashCode(int[] a)

주어진 int 배열에 대한 해시 코드를 반환합니다. 배열의 내용물에 기반하여 해시 코드를 생성합니다. 이 메서드는 배열의 모든 요소를 이용하여 해시 코드를 계산하므로, 배열의 내용이 같다면 항상 같은 해시 코드를 반환합니다.

int[] array = {1, 2, 3};
int hashCode = Arrays.hashCode(array);

배열 병렬 처리 및 정렬 메서드

1) parallelPrefix(int[] array, IntBinaryOperator op)

int[] array = {1, 2, 3, 4, 5};
Arrays.parallelPrefix(array, (x, y) -> x * y);

이 메서드는 배열의 각 요소에 대해 주어진 이진 연산자를 사용하여 병렬로 접두사를 계산합니다. 주어진 연산자는 배열의 각 요소에 적용되며, 결과는 이전 요소들을 기반으로 계산됩니다.

2) parallelSetAll(int[] array, IntUnaryOperator generator)

int[] array = new int[5];
Arrays.parallelSetAll(array, i -> i * 2);

이 메서드는 주어진 생성자 함수를 사용하여 배열의 모든 요소를 병렬로 설정합니다. 각 요소에 대해 주어진 함수를 적용하여 값을 생성하고 배열에 설정합니다. 이 과정은 병렬로 이루어지며, 배열의 크기가 클수록 병렬 처리의 이점을 더욱 누릴 수 있습니다.

3) parallelSort(int[] a)

int[] array = {5, 3, 1, 4, 2};
Arrays.parallelSort(array);

이 메서드는 배열을 병렬로 정렬합니다. 병렬 정렬은 배열의 크기가 큰 경우에 유용하며, 멀티코어 프로세서에서 성능을 향상시킬 수 있습니다. 내부적으로 Fork/Join 프레임워크를 사용하여 배열을 분할하고 병렬로 정렬합니다.

4) parallelSort(int[] a, int fromIndex, int toIndex)

int[] array = {5, 3, 1, 4, 2};
Arrays.parallelSort(array, 1, 4);

이 메서드는 배열의 일부분을 병렬로 정렬합니다. **fromIndex**부터 **toIndex**까지의 범위 내에서만 정렬을 수행하며, 실제로 **toIndex**는 정렬에 포함되지 않습니다. 따라서 정렬할 요소의 범위를 명시적으로 지정할 수 있습니다.

배열 정렬 메서드

1) sort(int[] a)

int[] array = {5, 3, 1, 4, 2};
Arrays.sort(array);

이 메서드는 주어진 int 배열을 오름차순으로 정렬합니다. 기본적으로 배열의 모든 요소를 정렬합니다.

2) sort(int[] a, int fromIndex, int toIndex)

int[] array = {5, 3, 1, 4, 2};
Arrays.sort(array, 1, 4);

이 메서드는 배열의 일부분을 정렬합니다. **fromIndex**부터 **toIndex**까지의 범위 내에서만 정렬을 수행하며, 실제로 **toIndex**는 정렬에 포함되지 않습니다.


내림차순으로 정렬하는 방법

Comparator 역순 사용

sort() 메서드는 두 번째 매개변수로 Comparator 객체를 받을 수 있습니다. Comparator를 사용하면 정렬 방법을 세부적으로 지정할 수 있습니다. 내림차순으로 정렬하려면 Comparator를 사용하여 역순으로 지정해주어야 합니다.

Arrays.sort(array, Collections.reverseOrder());

위 코드에서 **Collections.reverseOrder()**는 Comparator의 정적 메서드 중 하나로, 역순으로 정렬하는 Comparator를 반환합니다. 이를 sort() 메서드의 두 번째 매개변수로 전달하여 배열을 내림차순으로 정렬할 수 있습니다.

예시 코드

import java.util.Arrays;
import java.util.Collections;

public class Main {
    public static void main(String[] args) {
        Integer[] array = {5, 3, 1, 4, 2};

        // 내림차순으로 정렬
        Arrays.sort(array, Collections.reverseOrder());

        // 결과 출력
        System.out.println(Arrays.toString(array)); // [5, 4, 3, 2, 1]
    }
}

위 예시 코드에서는 Integer 배열을 내림차순으로 정렬하는 방법을 보여줍니다. sort() 메서드의 두 번째 인수로 **Collections.reverseOrder()**를 전달하여 역순으로 정렬하였습니다.


배열 스트림 메서드

1) spliterator(int[] array)

int[] array = {1, 2, 3, 4, 5};
Spliterator<Integer> spliterator = Arrays.spliterator(array);

이 메서드는 주어진 int 배열에 대한 Spliterator를 생성합니다. Spliterator는 배열의 요소를 탐색하고 분할할 수 있는 반복자입니다.

2) stream(int[] array)

int[] array = {1, 2, 3, 4, 5};
IntStream stream = Arrays.stream(array);

이 메서드는 주어진 int 배열에 대한 스트림을 생성합니다. 스트림을 통해 배열의 요소를 순차적으로 처리하거나 병렬로 처리할 수 있습니다.

3) stream(int[] array, int startInclusive, int endExclusive)

int[] array = {1, 2, 3, 4, 5};
IntStream stream = Arrays.stream(array, 1, 4);

이 메서드는 주어진 int 배열의 일부분에 대한 스트림을 생성합니다. **startInclusive**부터 **endExclusive**까지의 범위 내의 요소를 포함하여 스트림을 생성합니다.

배열 출력 메서드

toString(array)

//**toString(char[] a)**
char[] array = {'a', 'b', 'c', 'd', 'e'};
String arrayString = Arrays.toString(array);
// **toString(int[] a)**
int[] array = {1, 2, 3, 4, 5};
String arrayString = Arrays.toString(array);

이 메서드는 주어진 배열을 문자열로 변환하여 반환합니다. 배열의 모든 요소를 문자열로 이어붙여 반환합니다.

끝!

Arrays 클래스는 배열을 효율적으로 다룰 수 있게 해주는 강력한 도구입니다. 위에서 소개한 메서드들을 잘 이해하고 활용하면 배열 관련 작업을 보다 간편하게 수행할 수 있습니다. 추가적인 내용은 공식 자바 문서( Arrays (Java Platform SE 8 ) )를 참고하시면 도움이 될 것입니다. 함께 자바 프로그래밍을 보다 효율적으로 진행해봅시다!