olrlobt

[JAVA/자료구조] 배열 Array, Arrays 클래스와 메서드의 활용 본문

Java/자료구조

[JAVA/자료구조] 배열 Array, Arrays 클래스와 메서드의 활용

olrlobt 2023. 1. 13. 00:41

배열 (Array)

배열이란 선형 자료구조(Data Structure)중 하나로 동일한 타입의 연관된 데이터를 메모리에 연속적으로 저장하여 하나의 변수에 묶어서 관리하기 위한 자료 구조이다.


Arrays 클래스 (java.util.Arrays)

java.util 패키지의 일부로, 배열을 다루기 위한 다양한 메서드를 제공한다. 특정 값으로 요소를 정렬하거나, 검색 및 채우는 것과 같은 일반적인 배열 작업을 제공한다.


1차원 배열의 출력 : Arrays.toString(int [ ] arr) 

지정된 배열을 문자열의 형태로 반환한다. 일반적으로 배열을 반복문을 사용하지 않고 출력하기 위해 사용한다.

 public static void main(String[] args) {
 
        int [] arr = {0,1,2,3,4,5,6,7,8,9};

        System.out.println(Arrays.toString(arr));
    }


2차원 배열의 출력 : Arrays.deepToString(Object [ ] arr)

2차원 배열의 경우 배열 안에 배열을 저장한 것이므로, 1차원 배열과 같은 방법으로 출력하게 되면 주솟값을 출력하게 된다.

public static void main(String[] args) {

        int [][] arr2 = {{0,1,2,3,4},{5,6,7,8,9}};

        System.out.println(Arrays.toString(arr2));
    }

 

따라서 원하는 값을 출력하기 위해서는 배열 안에 배열을 지정해 주거나, deepToString() 메서드를 이용해서 출력할 수 있다.

public static void main(String[] args) {

        int [][] arr2 = {{0,1,2,3,4},{5,6,7,8,9}};

        System.out.println("---------toString----------");
        System.out.println(Arrays.toString(arr2[0]));
        System.out.println(Arrays.toString(arr2[1]));
        System.out.println("---------deepToString----------");
        System.out.println(Arrays.deepToString(arr2));
    }

 

 

 


1차원 배열의 정렬 : Arrays.sort(int [ ] arr)

주어진 배열을 오름차순으로 정렬한다.

 

 public static void main(String[] args) {

        int [] arr = {9,5,3,1,2,4,6,7,0,8};

        Arrays.sort(arr);

        System.out.println(Arrays.toString(arr));
    }

 

 

 

 

배열을 내림차순으로 정렬하기 위해서는, Collections.reverseOrder()를 사용해야 하는데,

Collections는 Object를 상속하는 클래스에서 사용 가능한 인터페이스이다.

 

int, long, double, char 같은 타입들은 기본형으로, Object를 상속하고 있지 않기 때문에

Object를 상속하는 자료형인 Integer, Long, Double, Character로 바꿔서 사용해 주어야 한다.

 

 

public static void main(String[] args) {

        Integer [] arr = {9,5,3,1,2,4,6,7,0,8};

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

        System.out.println(Arrays.toString(arr));
    }


2차원 배열의 정렬 : Arrays.sort(int [ ] arr, new Comparator)

2차원 배열의 정렬에서는 1차원과 같은 방법을 쓰기 위해서는 배열을 직접 지정해 주어야 한다.

public static void main(String[] args) {

        Integer [][] arr2 = {{1,4,2,6,3},{9,8,0,7,5}};

        Arrays.sort(arr2[0]);
        Arrays.sort(arr2[1]);
        System.out.println(Arrays.deepToString(arr2));

        Arrays.sort(arr2[0], Collections.reverseOrder());
        Arrays.sort(arr2[1], Collections.reverseOrder());
        System.out.println(Arrays.deepToString(arr2));
    }

 

 

다른 방법으로는 Comparator를 사용하는 방법이 있다.

 

아래와 같이 Comparator를 사용하면 다양한 방법으로 정렬이 가능하다.

 

public static void main(String[] args) {

        int [][] arr2 = {{4,3000},{0,1000},{2,4000},{3,2000},{1,5000}};

        Arrays.sort(arr2, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] - o2[0];
            }
        });

        System.out.println(Arrays.deepToString(arr2));
    }

 

Comparator를 사용하는 방법은 생각보다 간단하데, 인자값반환값에만 집중하면 된다.

 

위의 예시에서 인자값 o1, o2는 arr2 배열에 들어있는 배열 하나를 의미한다.

이 두 개의 인자가 compare 메서드 안에서 비교 과정을 거치게 되고, 반환 값에 따라 어떤 인자를 앞에 둘 지 결정하게 된다. 

 

반환값이 - 음수라면, o1이 앞으로 온다.

반환값이 0이라면 배열의 순서를 변경하지 않는다.

반환값이 +양수라면, o2가 앞으로 온다.

 

즉, {4,3000}과 {0,1000}이 위의 Comparator를 거치게 되면, 

o1 [0] - o2 [0] 이므로

4 - 0 > 0 양수이다. 따라서 o2 인 {0,1000}이 앞으로 정렬되는 것이다.

 

 

 

 

다음의 예시를 보자.

 public static void main(String[] args) {

        int [][] arr2 = {{4,3000},{0,1000},{2,4000},{3,2000},{1,5000}};

        Arrays.sort(arr2, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o2[1] - o1[1];
            }
        });

        System.out.println(Arrays.deepToString(arr2));
    }

o2와 o1의 위치가 바뀌었기 때문에, 내림차순 정렬이고,

배열의 인덱스가 0에서 1로 바뀌었기 때문에, 배열의 1번 인덱스로 비교를 한다.

 

따라서 위와 같은 답이 도출된다.

 

 

 


배열에 특정 값 채우기 : Arrays.fill(int [ ] arr , int value)

배열을 임의값으로 모두 채울 때 사용한다.

public static void main(String[] args) {

        int [] arr = new int[10];

        Arrays.fill(arr,7);

        System.out.println(Arrays.toString(arr));
    }

 

 

 

2차원 배열에 1차원 배열을 채우는 경우, 전과 같은 방식으로 채울 수 있다.

 public static void main(String[] args) {

        int [] arr = {0,1,2,3,4,5,6,7,8,9};
        int [][] arr2 = new int[3][10];

        Arrays.fill(arr2,arr);
        System.out.println(Arrays.deepToString(arr2));
    }

 

 

 

하지만, 2차원 배열에 숫자를 채우는 경우에는 배열을 지정해 주는 방식으로 사용해야 한다.

 public static void main(String[] args) {

        int [][] arr2 = new int[3][10];

        Arrays.fill(arr2[0],7);
        Arrays.fill(arr2[1],7);
        Arrays.fill(arr2[2],7);
        System.out.println(Arrays.deepToString(arr2));
    }

 

 

 

 


배열의 값 비교 : Arrays.equal(int [ ] arr , int [ ] arr2)

두 배열의 내용물이 같은지를 확인한다.

 

주솟값이 같은 건 아니기 때문에 일반적인 비교 ( == )을 사용한 결과는 false가 나온다.

 

public static void main(String[] args) {

        int [] arr = {0,1,2,3,4,5,6,7,8,9};
        int [] arr2 ={0,1,2,3,4,5,6,7,8,9};

        System.out.println(arr == arr2);
        System.out.println(Arrays.equals(arr,arr2));
    }

 


배열을 리스트로 변환 : Arrays.asList(Integer [ ] arr)

배열을 List로 변환한다.

 

public static void main(String[] args) {

        Integer [] arr = {0,1,2,3,4,5,6,7,8,9};

        List<Integer> arrAsList = Arrays.asList(arr);

        System.out.println(arrAsList);
    }

 

 

 


배열의 복사 : Arrays.copyOf( int [ ] arr , int newLength)

 

배열을 특정 길이만큼 복사한다. 이때, 입력받은 길이가 배열의 길이보다 길다면, 기본값이 채워진다.

 

public static void main(String[] args) {

        int [] arr = {0,1,2,3,4};

        int [] arr2 = Arrays.copyOf(arr,10);
        System.out.println(Arrays.toString(arr2));

        int [] arr3 = Arrays.copyOf(arr,3);
        System.out.println(Arrays.toString(arr3));
    }

 

 

 

 

Comments