Java/Java Study

[Collections Framework] Arrays

모모토 2021. 6. 3. 15:51
반응형

● Arrays

 

Arrays는 배열을 다루는 유용한 메서드의 집합이며, 배열을 매개변수로 받아서 우리가 원하는 작업들을 실행시켜준다.

 

Arrays 클래스로 우리가 배열을 다룰 수 있는 작업들이 무엇인지 알아보자.

 

( asList(); 메서드는 따로 포스팅을 할 예정!)

 

  • Overloading

Arrays의 메서드들은 타입별로 전부 Overloading이 되어있어서, 기본형 뿐만 아니라 참조 형배 열까지 정의되어있다.

 

static String toString(int[] a)
static String toString(boolean[] a)
static String toString(byte[] a)
static String toString(char[] a)
static String toString(short[] a)
static String toString(float[] a)
static String toString(double[] a)
static String toString(long[] a)
static String toString(Object[] a)

 

따라서 어떤 타입의 배열이던 Arrays 클래스를 쓰는데 제한이 없다.

 


 

  • 배열의 복사 - copyOf , copyOfRange

메서드의 이름을 보고 대강 느낌이 온다면 좋다. 복사를 하는 메서드이고 copyOfRange는 배열의 일부범위(Range)를 복사하는 것이다. copyOf는 처음부터 원하는 지점까지를 복사한다. 복사 배열을 공부하면서 본 사람들도 있을 것이다.

 

  1. copyOfRange( 배열 , 처음 index , 마지막 index ) - 복사하고자 하는 처음과 끝을 직접 지정
  2. copyOf( 배열 , 마지막 index ) - 복사 시작은 배열의 맨 첫 요소부터

 

	int[] arr1 = new int[10];
        int[] arr2 = new int[10];
        int[] arr3 = new int[7];
        for(int i =0;i<10;i++)
            arr1[i]=i+1;
        System.out.print("arr1[i] : ");
        for(int i =0;i<10;i++)
            System.out.print(arr1[i]);
        System.out.println();
        
        System.out.print("arr2[i] : ");
        for(int i =0;i<10;i++)
            System.out.print(+arr2[i]);
        System.out.println();
        //arr1을 arr2로 전체복사 copyOf
        arr2 = Arrays.copyOf(arr1,arr1.length);
        System.out.print("arr2[i] : ");
        for(int i =0;i<10;i++)
            System.out.print(arr2[i]);
        System.out.println();
        //arr1의 일부를 arr3로 복사 copyOfRange
        System.out.print("arr3[i] : ");
        for(int i =0;i<7;i++)
            System.out.print(arr3[i]);
        System.out.println();
        
        arr3 = Arrays.copyOfRange(arr1,2,9);
        System.out.print("arr3[i] : ");
        for(int i =0;i<7;i++)
            System.out.print(arr3[i]);

 

실행결과

 

arr1[i] : 12345678910
arr2[i] : 0000000000
arr2[i] : 12345678910
arr3[i] : 0000000
arr3[i] : 3456789

 


 

  • 배열 채우기 - fill , setAll

fill은 배열의 모든 요소를 원하는 값 하나로 채운다. setAll은 배열을 채우는 데 사용할 함수형 인터페이스를 매개변수로 받는데 람다식을 자주 이용한다. 참고로만 알고 넘어가자

 

  1. fill( 배열 , 채우고자 하는 내용)

 

 

int[] arr1 = new int[10];

        for(int i =0;i<10;i++)
            arr1[i]=i+1;
        System.out.print("arr1[i] : ");
        for(int i =0;i<10;i++)
            System.out.print(arr1[i]+" ");
        System.out.println();

        Arrays.fill(arr1,0); //내용을 전부 0으로 초기화

        System.out.print("arr1[i] : ");
        for(int i =0;i<10;i++)
            System.out.print(arr1[i]+" ");
        System.out.println();
        
        Arrays.setAll(arr1,(operand -> (int)(Math.random()*10)+1)); 
        // 내용을 1~10사이에서 랜덤으로 뽑아서 채워넣는다.

        System.out.print("arr1[i] : ");
        for(int i =0;i<10;i++)
            System.out.print(arr1[i]+" ");
        System.out.println();

 

실행결과

 

arr1[i] : 1 2 3 4 5 6 7 8 9 10 
arr1[i] : 0 0 0 0 0 0 0 0 0 0 
arr1[i] : 5 3 10 4 9 3 7 1 9 5 //실행시마다 내용바뀜

 


 

  • 배열의 정렬과 검색 - sort , binarySearch

  sort는 배열을 오름차순 정렬할 때 사용하고 , binarySearch는 이름 그대로 배열에 저장된 위치(index)를 검색하는 메서드이다. 이 두 가지 메서드는 깊은 연관이 있는데 sort로 정렬된 후에만 binarySearch로 검색할 수 있다. sort로 정렬하지 않고도 검색하는 linear search도 존재하지만 시간이 오래 걸린다는 단점이 있다. 그리고 binarySearch는 만일 배열에 중복요소들이 존재할 시 중복된 요소 중에서 어떤 것의 index를 가져올지 알 순 없다.

 

  1. sort(배열) - 정렬
  2. binarySearch(배열, 요소) - 해당 요소가 들어있는 index를 반환한다.

 

		int[] arr1 = new int[10];

        for(int i =0;i<10;i++)
            arr1[i]=(int)(Math.random()*10)+1;

        System.out.print("arr1[i] : ");
        for(int i =0;i<10;i++)
            System.out.print(arr1[i]+" ");
        System.out.println();

        Arrays.sort(arr1); //정렬렬

       System.out.print("arr1[i] : ");
        for(int i =0;i<10;i++)
            System.out.print(arr1[i]+" ");
        System.out.println();

        int index = Arrays.binarySearch(arr1, 4);
        System.out.println("해당값이 존재하는 index =" + index);

 

실행결과 1

 

arr1[i] : 5 5 8 10 6 9 2 4 8 3 
arr1[i] : 2 3 4 5 5 6 8 8 9 10 
해당값이 존재하는 index =2

 

실행결과 2

 

arr1[i] : 5 7 1 9 6 9 5 2 9 1 
arr1[i] : 1 1 2 5 5 6 7 9 9 9 
해당값이 존재하는 index =-4 // 값이 존재하지않거나 정렬을 거치지않을때 나타나는 값

 

그런데 sort는 왜 오름차순이 정렬의 디폴트일까? 다른 방식으로 정렬할 순 없을까?

 

sort가 정렬하는 기준이 있다면 그 기준을 바꾸어서 쓸 수 있지 않을까?

 

sort의 정렬 기준 Comparable & Comparator를 참고하자!


 

  • 배열의 비교와 출력 - equals(& deepEquals) , toString(& deepToString)

 equals는 배열의 내용과 순서가 일치하는지를 판단하는 메서드이다. equals는 일차원 배열끼리 비교, 이차원 배열은 deepEquals를 사용한다. toString은 배열의 내용을 문자열로 반환하여주며 위에서는 for문을 이용하여 배열을 출력하였는데 더 이상 그러지 않아도 된다.

 

  1. equals(배열 1, 배열 2) - 배열 1과 배열 2를 비교한다. 같으면 true, 다르면 false
  2. toString(배열) - 배열의 내용들을 문자열로 출력

 

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


        System.out.print("arr1[i] : "+Arrays.toString(arr1));
        System.out.println();
        System.out.println("arr2[i] : "+Arrays.toString(arr2));
        System.out.println();

        Arrays.sort(arr2); // 정렬

        if (Arrays.equals(arr1,arr2)) { //두 배열이 같다면 if문이 실행
            System.out.println("일치합니다.");
            System.out.println("arr2[i] : "+Arrays.toString(arr2));
        }

 

실행결과

 

arr1[i] : [1, 2, 3, 4, 5]
arr2[i] : [5, 4, 3, 2, 1]

일치합니다.
arr2[i] : [1, 2, 3, 4, 5]