wooing

[JAVA] 배열(Array) 개념과 util.Arrays사용방법 정리 본문

CS

[JAVA] 배열(Array) 개념과 util.Arrays사용방법 정리

우잉_ 2025. 3. 21. 01:07

배열 자료형

배열은 복수의 동일한 자료형의 변수를 연속된 공간에 나열하고, 각 데이터에 인덱스(index)를 부여해놓은 자료구조이다.

출처: https://hongong.hanbit.co.kr/java-%EC%9E%90%EB%B0%94-%EB%B0%B0%EC%97%B4array-%EC%84%A0%EC%96%B8%ED%95%98%EA%B3%A0-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0/

 

배열의 특징

  • 배열은 같은 타입의 데이터만 저장할 수 있다. 다른 타입을 저장하려고 하면 Type mismatch 컴파일 에러가 발생한다.
  • 한 번 생선된 배열은 길이를 늘리거나 줄일 수 없다.

배열 사용 방법

배열 선언 & 초기화

배열을 생성할때는 배열의 타입과 크기를 정의해야한다.

// 정수형 배열 선언과 생성 (크기 5)
int[] numbers = new int[5];

// 정수형 배열 선언과 초기화
int[] numbers2 = {1, 2, 3, 4, 5};

// 문자열 배열 선언과 초기화
String[] fruits = {"Apple", "Banana", "Cherry"};

// 2차원 배열 선언
int[][] arr = new int[4][3];
score[0][1] = 10;
score[0][1] = 20;
...
score[3][0] = 10;
score[3][1] = 20;

int[][] arr2 = {
                  {10,20,30},
                  {10,20,30},
                  {10,20,30},
                  {10,20,30}
                };

타입별 배열 기본값

분류 타입 초기값
Primitive Type(정수) byte[] 0
char[] '\u0000'
short[] 0
int[] 0
long[] 0L
Primitive Type(실수) float[] 0.0F
double[] 0.0
Primitive Type(논리) boolean[] false
참조 타입 Class[] null
Inteface[] null

배열 요소 접근

Console에 배열의 값을 출력 하려면 각 인덱스에 접근하여 값을 출력하거나 문자형태로 출력해야한다. 만약 배열 변수를 그대로 System.out.println() 에 입력하면 배열의 주소값이 출력되게 된다.

int[] numbers = {10, 20, 30, 40, 50};

//주소값 출력
//[I : integer 배열 , @1b6d3586 : 주소값
System.out.println(iArr); //[I@1b6d3586


System.out.println(numbers[0]); // 10 출력
System.out.println(numbers[3]); // 40 출력

System.out.println(Arrays.toString(iArr)); // [10, 20, 30, 40, 50]

 

Arrays 클래스

Arrays 클래스는 Java에서 배열 조작 기능을 가지고 있는 클래스이다. 배열의 복사, 항목 정렬, 항목 검색과 같은 기능을 수행하는 메소드가 메소드가 구현되어있고, JDK 1.2부터 사용 가능하다. 모든 메소드는 static으로 구현되어있어 객체 생성 없이 메소드를 사용할 수 있다.

 

메서드 설명
Arrays.toString(array) 입력한 배열 문자열 변환
Arrays.asList(array) 배열을 기반으로 List생성 (크기 고정)
Arrays.copyOf(array) 입력한 배열의 값을 복사하여 새로운 배열 생성 (깊은 복사)
Arrays.sort(array) 입력한 배열을 정렬한다
Arrays.equals(arr1, arr2) 입력한 두 배열이 같은지 비교한다.
Arrays.compare(arr1, arr2) 입력한 두 배열을 비교한다.
(같으면: 0. arr1이 크면: 양수, arr1이 작으면: 음수)
Arrays.binarySearch(array, key) 정렬된 배열에서 이진 탐색 수행하여 인덱스 반환
Arrays.fill(array, val) 배열의 모든 값을 특정 값으로 채움
Arrays.mismatch(arr1, arr2) 입력한 두 배열에서 첫 번째 불일치 인덱스 반환
Arrays.stream(array) 입력한 배열의 Stream 클래스 반환

Arrays.toString(array) : 배열 문자열 변환 메소드

배열을 출력하려면 각 인덱스에 접근하여 원소 하나씩 출력하여야 한다. 이를 간편하게 출력하는 방법으로는 아래와 같이 Arrays의 toString 메소드를 사용할 수 있다. 만약, 배열이 2차원 이상 경우 toString으로 출력했을때 각 행에 해당하는 배열의 주소가 출력된다. 그 이유는 toString 메소드는 단순히 첫번째 차원의 원소를 출력해내기 때문이다. 다차원에서 배열의 원소를 모두 출력하려면 deepToString()을 사용하여야 한다. deepToString()은 재귀적로 구현되어있기때문에 2차원 외에도 3차원, 4차원 등 모든 차원에 대해 출력이 가능하다. 

int[][][] threeDArray = {
            {
                {1, 2, 3},
                {4, 5, 6}
            },
            {
                {7, 8, 9},
                {10, 11, 12}
            }
        };

System.out.println(Arrays.deepToString(threeDArray));

 

Arrays.asList(array): 배열 -> 리스트 변환 메소드

배열을 고정 크기의 리스트(List)로 변환하는 메소드이다. 이때 반환되는 리스트는 크기 변경(추가/삭제)이 불가능하다. 만약, 수정 가능한 리스트로 변환하려면 ArrayList형태로 List를 새로 생성해야한다. 주의해야할 점은 int, float와 같은 primitive 타입은 바로 리스트로 변환이 불가능하다. 그 이유는, List인터페이스에는 제너릭 타입 매개변수가 필요한데 이는 클래스만 들어갈 수 있기 때문이다.

String[] arr = {"a", "b", "c"};
List<String> list = Arrays.asList(arr);		// 변경 불가능한 리스트
List<String> modifiableList = new ArrayList<>(Arrays.asList(arr)); // 변경 가능한 리스트


// Primitive타입 List변환 방법
int[] numbers = {1, 2, 3, 4, 5};
// Arrays.stream() + boxed() 활용 (int -> Integer 변환)
List<Integer> list = Arrays.stream(numbers).boxed().collect(Collectors.toList());

Arrays.copyOf(array): 배열 복사

배열값을 새로운 배열로 깊은 복사하는 메소드이다. 길이 그대로 복사할 수 있으며 함수 오버라이딩으로 길이를 변환하여 복사하여 사용할 수 있다.

int[] original = {1, 2, 3};
int[] copy = Arrays.copyOf(original, 5); // 배열 복사
System.out.println(Arrays.toString(copy)); // [1, 2, 3]

int[] size_copy = Arrays.copyOf(original, 5); // 크기를 5로 변경 (기존 값 유지, 나머지 0)
System.out.println(Arrays.toString(size_copy)); // [1, 2, 3, 0, 0]

 

Arrays.sort(array): 배열 정렬

입력한 배열을 정렬하는 메소드이다. 기본적으로는 오름차순 정렬되며 Comparator를 재정의 함으로써 정렬 순서를 정의할 수 있다. 그러나, Comparator을 정의하려면 primitive 타입은 불가능하고 Wrapper class를 사용하여야 한다. 그 이유는, Comparator또한 제너릭 타입을 필요로 하기때문이다. Comparator를 정의할때 람다로도 구현이 가능한데 오름차순으로 정렬하려면 첫번째 인자가 클때 양수가, 내림차순으로 정렬하려면 두번째 인자가 클때 양수가 반환되도록 구현하면 된다.

추가적으로 sort메소드도 fromIndex, toIndex를 입력하면 특정 길이를 정렬할 수 있다.

int[] numbers = {5, 2, 8, 1, 3};

// 람다를 사용한 내림차순 정렬
Arrays.sort(numbers);	//오름차순 정렬
System.out.println(Arrays.toString(numbers)); // [1, 2, 3, 5, 8]

// Comarator를 정의하여 내림차순 정렬
Integer[] numbers2 = {5, 2, 8, 1, 3};
Arrays.sort(numbers2, Collections.reverseOrder());
System.out.println(Arrays.toString(numbers2)); // [8, 5, 3, 2, 1]

Arrays.sort(numbers2, (a,b) -> { return b - a;});	//람다를 이용하는 방법
System.out.println(Arrays.toString(numbers2)); // [8, 5, 3, 2, 1]

Arrays.compare(arr1, arr2), Arrays.equals(arr1, arr2): 배열 비교

입력한 배열을 정렬하는 메소드이다. compare메소드도 sort와 마찬가지로 Comparator를 정의하여 정렬 순서를 커스텀 할 수 있으며, 비교 범위를 정의할 수 있다.

int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
int[] arr3 = {1, 2, 4};

System.out.println(Arrays.compare(arr1, arr2)); // 0 (같음)
System.out.println(Arrays.compare(arr1, arr3)); // -1 (arr1이 작음)
System.out.println(Arrays.compare(arr3, arr1)); // 1 (arr3이 큼)


Arrays.binarySearch(array, key): 배열 이진 탐색

이 메소드는 정렬된 배열에서 이진 검색을 수행하여 해당 값의 인덱스를 반환하거나 해당 값이 삽입되는 최적 위치를 반환하는 메소드이다. 정렬된 배열을 입력했을때 올바른 값이 반환되므로 해당 메소드를 사용하기 전에 배열을 정렬해야한다. 반환되는 값은 아래와 같다.

응답종류 반환값
값을 찾은 경우 해당 위치의 인덱스 반환
값을 못 찾은 경우 음수 반환 => -(삽입위치 + 1)
int[] numbers = {1, 2, 3, 5, 8}; // 정렬됨

int index = Arrays.binarySearch(numbers, 5);
System.out.println("5의 위치: " + index); // 5의 위치: 3

int[] numbers2 = {1, 2, 3, 4, 8}; // 정렬됨

int index2 = Arrays.binarySearch(numbers2, 5);
System.out.println("5의 위치: " + index2); // 5의 위치: -5


Arrays.fill(array, val): 배열 채우기

배열에 특정값으로 채우는 메소드이다. fromIndex, toIndex를 입력하면 입력한 범위에 특정값으로 채우게된다.

int[] numbers = new int[5];
Arrays.fill(numbers, 7);

System.out.println(Arrays.toString(numbers)); // [7, 7, 7, 7, 7]


Arrays.stream(array)

Arrays.stream()은 배열을 Stream 객체로 변환하는 메소드이다. Stream은 Stream API를 사용하여 배열을 람다 표현식과 함수형 프로그래밍을 통해 효율적으로 처리하기 위한 클래스이며, 더욱 간단하고 직관적이게 배열을 사용할 수 있게된다. Stream은 Java 8에 등장한 개념으로, JDK 1.8 이상에서 사용할 수 있다. Stream만 하더라도 내용이 많기때문에 이에 대해서는 따로 글을 작성하겠다. 

 

References

  1. 신용권/이것이 자바다/한빛미디어/2015 (https://www.hanbit.co.kr/store/books/look.php?p_code=B1460673937)
  2. https://hongong.hanbit.co.kr/java-%EC%9E%90%EB%B0%94-%EB%B0%B0%EC%97%B4array-%EC%84%A0%EC%96%B8%ED%95%98%EA%B3%A0-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0/
  3. https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9E%90%EB%B0%94-%EB%B0%B0%EC%97%B4Array-%EB%AC%B8%EB%B2%95-%EC%9D%91%EC%9A%A9-%EC%B4%9D%EC%A0%95%EB%A6%AC

'CS' 카테고리의 다른 글

정규화와 반정규화(비정규화)란?  (1) 2025.03.17
OSI 7계층과 계층별 역할  (1) 2025.01.19
JWT와 사용 전략  (0) 2024.08.27
[자료구조] AVL트리 [JAVA]  (0) 2020.08.30
[자료구조] 트리  (0) 2020.07.20