코린이의 소소한 공부노트

배열 (5) Arrays클래스 본문

Java

배열 (5) Arrays클래스

무지맘 2022. 2. 20. 15:21

Arrays클래스는 배열 관련 메서드를 모아놓은 클래스이다. 이 중 많이 쓰는 메서드 몇 가지를 보려 한다.

 

1. 배열의 내용을 문자열로 출력하기

1) 1차원 배열의 내용을 출력할 때 이용하는 메서드 toString()

int[] arr1d = {0, 1, 2, 3};
System.out.println(Arrays.toString(arr1d)); // [0, 1, 2, 3]

2) 2차원 이상의 배열의 내용을 출력할 때 이용하는 메서드 deepToString()

int[][] arr2d = { {00, 01}, {10, 11} };
System.out.println(Arrays.deepToString(arr2d)); // [[0, 1], [10, 11]]

// 2차원 배열에 toString()을 쓰면 어떻게 될까?
System.out.println(Arrays.toString(arr2d)); // [[I@2401f4c3, [I@7637f22]
// 각 행의 주소가 출력됨

 

2. 배열의 내용을 비교해보기

Arrays클래스는 등가 비교 연산자(==)를 지원하지 않는 대신 메서드를 지원한다. 만약 메서드 없이 배열의 요소 하나하나를 비교하려면 반복문을 이용해야 하는데, 다행히 그럴 필요는 없다.

1) 1차원 배열 2개의 내용을 비교하는 메서드 equals()

String[] arr1 = {"aa", "bb", "cc"};
String[] arr2 = {"aa", "bb", "cc"};
String[] arr3 = {"dd", "ee", "ff"};

// 1) equals()를 이용하여 비교
System.out.println(Arrays.equals(arr1,arr2)); // true
System.out.println(Arrays.equals(arr1,arr3)); // false

// 2) 등가 비교 연산자를 이용하여 비교
System.out.println(arr1 == arr2); // false
System.out.println(arr1 == arr3); // false
// 참조 변수는 배열 이름에 주소가 담겨 있음
// 각 배열의 주소가 다 다르기 때문에 false가 나옴

2) 2차원 이상의 배열 2개의 내용을 비교하는 메서드 deepEquals()

String[][] arr1 = { {"aa", "bb"}, {"cc", "dd"} };
String[][] arr2 = { {"aa", "bb"}, {"cc", "dd"} };
String[][] arr3 = { {"ee", "ff"}, {"gg", "hh"} };

// 1) deepEquals()를 이용하여 비교
System.out.println(Arrays.deepEquals(arr1,arr2)); // true
System.out.println(Arrays.deepEquals(arr1,arr3)); // false

// 2) 등가 비교 연산자를 이용하여 비교
System.out.println(arr1 == arr2); // false
System.out.println(arr1 == arr3); // false
// 각 배열의 주소가 다 다르기 때문에 false가 나옴

// 3) equals()를 이용하여 비교
System.out.println(Arrays.equals(arr1,arr2)); // false
System.out.println(Arrays.equals(arr1,arr3)); // false
// 2차원 배열에서 toString()을 썼을 때 주소가 나왔었다.
// equals()는 1차적인 내용(여기서는 주소)만 확인하기 때문에
// 결과는 false가 나오게 된다.

 

3. 배열의 내용을 복사하기

1) 맨 앞에서부터 복사하는 copyOf()

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

// 1) 상수 length를 이용해 전체 복사하기
int[] arr1 = Arrays.copyOf(arr, arr.length); // arr1= [0, 1, 2, 3]

// 2) 복사할 요소의 개수를 지정하기
int[] arr2 = Arrays.copyOf(arr, 3); // arr2= [0, 1, 2]

// 3) 지정한 개수가 복사할 배열의 길이를 초과한다면?
int[] arr3 = Arrays.copyOf(arr, 7); // arr3= [0, 1, 2, 3, 0, 0, 0]
// 인덱스의 범위를 벗어난 요소는 0으로 채워짐

2) 중간부터 복사할 수 있는 copyOfRange()

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

// 1) 인덱스가 x 이상 y 미만인 요소 복사하기
int[] arr1 = Arrays.copyOfRange(arr, 1, 3); // arr1= [1, 2]

// 2) 지정한 인덱스가 복사할 배열의 인덱스를 초과한다면?
int[] arr2 = Arrays.copyOfRange(arr, 2, 7); // arr2= [2, 3, 0, 0, 0]
// 인덱스의 범위를 벗어난 요소는 0으로 채워짐

 

 

4. 배열의 내용을 정렬하기

sort() 메서드를 이용하면 요소를 오름차순으로 정렬해준다.

int[] arr = {5, 9, 2, 4, 1, 0, 6, 8, 7, 3};
Arrays.sort(arr);		
System.out.println(Arrays.toString(arr));
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

sort() 메서드는 새로 배열을 복사해서 정렬을 하는 것이 아니라 있는 배열을 정렬하기 때문에 반환 값이 없다(void). 따라서 sort() 메서드를 실행 후 어딘가에 저장하려고 하면 에러가 발생한다.

int[] arr1 = Arrays.sort(arr);
// Type mismatch: cannot convert from void to int[]

배열을 내림차순으로 정렬하고 싶다면 메서드에 Collections.reverseOrder() 인자를 추가하면 된다.

Integer[] arr = {5, 9, 2, 4, 1, 0, 6, 8, 7, 3};
Arrays.sort(arr, Collections.reverseOrder());		
System.out.println(Arrays.toString(arr));
// [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

지금까지 봤던 것과의 차이점은 arr를 선언할 때 int가 아닌 Integer로 타입을 쓴 것이다. 이와 관련된 것은 추후 설명 예정이니, 지금은 그냥 받아들이자.

'Java' 카테고리의 다른 글

클래스, 객체, 인스턴스  (0) 2022.02.20
객체지향 언어의 도입 배경과 특징  (0) 2022.02.20
String 클래스  (0) 2022.02.06
배열 (4) 2차원 배열  (0) 2022.01.24
배열 (3) 활용 예시  (0) 2022.01.20