Back - end/JAVA
[ Java ] Arrays 클래스
낫쏘링
2023. 9. 3. 20:30
728x90
[ Arrays 클래스 ]
- 배열을 다루기 위한 메서드가 선언되어 있는 클래스import java.util.Arrays;
- 클래스 내의 메서드는 모두 static으로 선언되어 있기 때문에 객체를 생성하지 않고 사용이 가능하다.
// 기본타입 혹은 String 타입의 배열을 오름차순으로 정렬하는 메서드 // static으로 선언 된 메서드는 외부 클래스에서 객체 생성 없이 바로 사용 가능하다. (new 생성자) public static void sort(int[] a) { DualPivotQuicksort.sort(a, 0, 0, a.length); }
[ 배열 오름차순 정렬 ]
Arrays.sort(배열이름)
Arrays.sort(배열이름, 시작 인덱스, 끝 '전' 인덱스) - 부분 정렬
int[] arr = {5,4,3,2,1}; // for문을 통해서 arr를 출력하면 5 4 3 2 1 Arrays.sort(arr); // for문을 통해서 arr를 출력하면 1 2 3 4 5 --------------------------------------------------- int[] arr = {5,2,1,8,6}; // for문을 통해서 arr를 출력하면 5 2 1 8 6 Arrays.sort(arr, 0, 3); // for문을 통해서 arr를 출력하면 1 2 5 8 6
[ 배열 내림차순 정렬 ]
Arrays.sort(배열이름, Collections.reverseOrder())
Arrays.sort(배열이름, 시작 인덱스, 끝 '전' 인덱스, Collections.reverseOrder()) - 부분 정렬
- import java.util.Collections// int는 Collections.reverseOrder()를 사용할 수 없다. // 배열을 Integer로 선언해줘야 사용 가능 Integer[] arr = {1,2,3,4,5}; // for문을 통해서 arr를 출력하면 1 2 3 4 5 Arrays.sort(arr, Collections.reverseOrder()); // for문을 통해서 arr를 출력하면 5 4 3 2 1 --------------------------------------------------- int[] arr = {5,2,1,8,6}; // for문을 통해서 arr를 출력하면 5 2 1 8 6 Arrays.sort(arr, 2, 5, Collections.reverseOrder()); // for문을 통해서 arr를 출력하면 5 2 8 6 1 --------------------------------------------------- 일반 배열 대신 List 사용했을 경우 - Collections.reverse(배열이름) 를 사용하면 차순으로 정렬하지 않고 순서만 거꾸로 뒤집을 수 있다. Collections.reverse(배열이름.subList(시작인덱스,끝 '전' 인덱스))는 부분 뒤집기
[ 배열 출력 ]
Arrays.toString(배열이름)int[] arr = {5,4,3,2,1}; for( int num : arr ){ System.out.print(num + " "); } // 5 4 3 2 1 출력 System.out.print(Arrays.toString(arr)); // [1,2,3,4,5] 출력 // 배열을 출력할 때 주의할 점 ! // 배열은 참조 타입이기 때문에 // System.out.print(arr)를 사용하면 // 배열에 담긴 값이 아니라 해당 배열의 주소를 출력한다. // Arrays.toString(arr)를 사용하거나 for문을 통해서 배열을 돌아줘야 한다.
[ 배열 복사 ]
Arrays.copyOf(복사할 배열, 복사할 요소 길이) - 0번 인덱스부터 복사한다.
Arrays.copyOfRange(복사할 배열, 복사 시작 인덱스, 복사 끝 '전' 인덱스) - 복사 시작 인덱스와 끝을 정할 수 있다.
- 값에 의한 복사이기 때문에 복사 후 붙여넣기 한 배열에서 값을 바꿔도 복사 배열(원본)이 바뀌지 않는다. (주소 복사x)System.arraycopy() - 복사 시작과 길이(끝), 붙여넣기 시작할 배열의 인덱스 까지 모두 지정할 수 있음 - 값 복사 (주소복사x) - 붙여넣기 할 배열 미리 생성해 둬야 함 Arrays.copyOf() - 복사 시작 정할 수 없음(무조건 0번 인덱스 부터), 복사 길이 정할 수 있음, 붙여 넣기 시작할 배열의 인덱스 정할 수 없음 - 값 복사 (주소복사x) Arrays.copyOfRange() - 복사 시작과 길이(끝) 정할 수 있음, 붙여 넣기 시작할 배열의 인덱스 정할 수 없음 - 값 복사 (주소복사x) -> 붙여넣을 때 시작 배열을 정해야 할 경우 또는 원본 배열을 유지할 필요가 없는 경우 System.arraycopy 사용 불필요할 경우에 복사 시작할 인덱스를 정해야 하면 copyOfRange 사용 간단하게 복사 길이만 정할 경우 copyOf를 사용하면 될 것 같다.
// 원본을 유지하는 복사 int[] arr1 = {5,4,3,2,1}; int[] copyArrSystem = new int[3]; System.arraycopy(arr1, 2, copyArrSystem, 1, 2); // 복사 후 : arr1 = [5,4,3,2,1] / copyArrySystem = [0,3,2] (빈 배열은 0으로 채워진다.) int[] arr2 = {5,4,3,2,1}; int[] copyArrArrays = Arrays.copyOfRange(arr2, 2,4); // 복사 후 : arr2 = [5,4,3,2,1] / copyArryArrays = [3,2] --------------------------------------------------------------------------------------- // 원본에 덮어쓰기 할 경우 int[] arr1 = {5,4,3,2,1}; System.arraycopy(arr1, 2, arr1, 1, 2); // 복사 전 : arr1 = [5,4,3,2,1] / 복사후 : arr2 = [5,3,2,2,1] (원본 유지 상태에서 변경) int[] arr2 = {5,4,3,2,1}; arr2 = Arrays.copyOfRange(arr2, 2,4); // 복사 전 : arr2 = [5,4,3,2,1] / 복사 후 : arr2 = [3,2] (원본 자체가 사라짐)
[ 배열 요소의 인덱스 찾기 ]
Arrays.binarySearch(배열이름,찾는요소)int[] arr = {5,4,3,2,1}; // binarySearch를 사용 전 반드시 오름차순으로 정렬해줘야 한다. // 만약 정렬하지 않고 사용할 경우 값과 상관 없는 음수를 반환한다. Arrays.sort(arr); // 배열이 5,4,3,2,1이라고 착각해서 2를 찾으면 3이 나올거라고 생각할 수 있지만, // 앞에서 sort를 통해 오름차순으로 1,2,3,4,5로 정렬해줬기 때문에 1이 반환된다. System.out.print(Arrays.binarySearch(arr, 2)); // 배열에 없는 요소 검색할 경우 값과 상관 없는 음수를 반환한다. System.out.print(Arrays.binarySearch(arr, 8));
[ 배열 값 일괄 초기화(채우기) ]
Arrays.fill(배열이름,채울 요소)// 크기가 10인 배열을 모두 숫자 1로 채우고 싶을 때 int[] arr = new int[10]; // for문 사용 //length : 배열의 길이 / length() : 문자열의 길이 / size() : 컬렉션 프레임워크(List...)의 길이 for(int num = 0; num < arr.length; num += 1){ arr[num] = 1; } // Arrays 클래스 사용 Arrays.fill(arr,1);
[ 배열 요소 비교 ]
Arrays.equals(배열이름1, 배열이름2)int[] arr1 = {1,2,3}; int[] arr2 = {1,2,3}; // 두 배열이 같은 '객체'인지 비교 arr1.equals(arr2); // false // 배열의 '요소'가 같은지 비교 Arrays.equals(arr1,arr2); // true
728x90