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