● 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는 처음부터 원하는 지점까지를 복사한다. 복사 배열을 공부하면서 본 사람들도 있을 것이다.
- copyOfRange( 배열 , 처음 index , 마지막 index ) - 복사하고자 하는 처음과 끝을 직접 지정
- 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은 배열을 채우는 데 사용할 함수형 인터페이스를 매개변수로 받는데 람다식을 자주 이용한다. 참고로만 알고 넘어가자
- 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를 가져올지 알 순 없다.
- sort(배열) - 정렬
- 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문을 이용하여 배열을 출력하였는데 더 이상 그러지 않아도 된다.
- equals(배열 1, 배열 2) - 배열 1과 배열 2를 비교한다. 같으면 true, 다르면 false
- 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]
'Java > Java Study' 카테고리의 다른 글
[ 객체지향 ] static (0) | 2021.07.08 |
---|---|
[Collections Framework] Arrays.sort( ); - (Comparable & Comparator) (0) | 2021.06.03 |
[객체지향] Static 메서드는 언제 쓸까? (0) | 2021.06.02 |
[Collections Framework] LinkedList (vs Array) (0) | 2021.05.31 |
[Collections Framework] Iterator 와 메서드 iterator (0) | 2021.05.27 |