Arrays 클래스
배열 조작 기능을 가지고 있다. (배열의 복사, 항목 정렬, 항목 검색 등의 기능)
단순한 배열 복사는 System.arraycopy() 메소드를 사용할 수 있으나,
Arrays는 추가적으로 항목 정렬, 항목 검색, 항목 비교와 같은 기능을 제공해준다.
Arrays 클래스의 메소드들
(모든 메소드는 static 이므로 Arrays 클래스로 바로 사용 가능하다.)
리턴 타입 |
메소드 이름 |
설명 |
int |
binarySearch(배열, 찾는값) |
전체 배열 항목에서 찾는 값이 있는 인덱스 리턴 |
타겟 배열 |
copyOf(원본배열, 복사할길이) |
원본 배열의 0번 인덱스에서 복사할 길이 만큼 복사한 배열 리턴, 복사할 길이는 원본 배열보다 커도 되며, 타겟 배열의 길이가 된다. |
타겟 배열 |
copyOfRange(원본배열, 시작인덱스, 끝인덱스) |
원본 배열의 시작 인덱스에서 끝 인덱스까지 복사한 배열 리턴 |
boolean |
deepEquals(배열, 배열) |
두 배열의 깊은 비교 (중첩 배열의 항목까지 비교) |
boolean |
equals(배열, 값) |
두 배열의 얕은 비교 (중첩 배열의 항목은 비교하지 않음) |
void |
fill(배열, 값) |
전체 배열 항목에 동일한 값을 저장 |
void |
fill(배열, 시작인덱스, 끝인덱스, 값) |
시작 인덱스부터 끝 인덱스까지의 항목에만 동일한 값을 저장 |
void |
sort(배열) |
배열 전체 항목을 오름차순으로 정렬 |
String |
toString(배열) |
“[값1, 값2, ...]”와 같은 문자열 리턴 |
1. 배열 복사
copyOf(원본배열, 복사할길이) 메소드
원본 배열의 0번 인덱스에서 복사할 길이 만큼 복사한 타켓 배열을 리턴한다.
복사할 길이는 원본 배열의 길이보다 커도 되며, 타겟 배열의 길이가 된다.
char[] arr1 = {‘J’, ‘A’, ‘V’, ‘A’};
char[] arr2 = Arrays.copyOf(arr1, arr1.length); // arr1 길이 만큼 복사
copyOfRange(원본배열, 시작인덱스, 끝인덱스) 메소드
원본 배열의 시작 인덱스에서 끝 인덱스 까지 복사한 배열을 리턴한다.
시작 인덱스는 포함되지만, 끝 인덱스는 포함되지 않는다.
char[] arr1 = {‘J’, ‘A’, ‘V’, ‘A’};
char[] arr2 = Arrays.copyOfRange(arr1, 1, 3); // 인덱스 1 ~ 2 까지 복사
단순히 배열을 복사할 목적이면 System.arraycopy() 메소드를 이용할 수 있다.
아래와 같이 5개의 매개값이 필요하다.
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
Object src : 원본 배열
int srcPos : 원본 시작 인덱스 (복사할 항목의 시작 위치)
Object dest : 타겟 배열
int destPos : 타겟 시작 인덱스 (타겟 배열에서의 복사 시작 위치)
int length : 복사 개수 (원본 시작 인덱스에서 몇 개의 항목을 복사할 것인지 정함)
예) ArrayCopyExample.java : 배열 복사
public class ArrayCopyExample {
public static void main(String[] args) {
char[] arr1 = {‘J’, ‘A’, ‘V’, ‘A’};
// 방법1 : arr1 전체를 arr2 로 복사
char[] arr2 = Array.copyOf(arr1, arr1.length);
System.out.println(Arrays.toString(arr2));
// 방법2 : arr1[1] ~ arr1[2] 를 arr3[0] ~ arr3[1] 로 복사
char[] arr3 = Arrays.copyOfRange(arr1, 1, 3);
System.out.println(Arrays.toString(arr3));
// 방법3 : arr1 전체를 arr4로 복사
char[] arr4 = new char[arr1.length];
System.arraycopy(arr1, 0, arr4, 0, arr1.length);
for(int i = 0; i < arr4.length; i++) {
System.out.println(“arr4[” + i + “]=” + arr4[i]);
}
}
}
예) ArrayCopyExample.java : 배열 복사
public class ArrayCopyExample {
public static void main(String[] args) {
char[] arr1 = {‘J’, ‘A’, ‘V’, ‘A’};
// 방법1 : arr1 전체를 arr2 로 복사
char[] arr2 = Array.copyOf(arr1, arr1.length);
System.out.println(Arrays.toString(arr2));
// 방법2 : arr1[1] ~ arr1[2] 를 arr3[0] ~ arr3[1] 로 복사
char[] arr3 = Arrays.copyOfRange(arr1, 1, 3);
System.out.println(Arrays.toString(arr3));
// 방법3 : arr1 전체를 arr4로 복사
char[] arr4 = new char[arr1.length];
System.arraycopy(arr1, 0, arr4, 0, arr1.length);
for(int i = 0; i < arr4.length; i++) {
System.out.println(“arr4[” + i + “]=” + arr4[i]);
}
}
}
2. 배열 항목 비교
Arrays 의 equals() 와 deepEquals() 는 배열 항목을 비교한다.
Arrays.equals() 는 1차 항목의 값만 비교하고,
Arrays.deepEquals() 는 중첩된 배열의 항목까지 비교한다.
예) EqualsExample.java : 배열 비교
public class EqualsExample {
public static void main(String[] args) {
int[][] original = { {1, 2}, {3, 4} };
// 얕은 복사 후 비교
System.out.println(“[얕은 복제 후 비교]”);
int[][] cloned1 = Arrays.copyOf(original, original.length);
System.out.println(“배열 번지 비교 : ” + original.equals(cloned1));
System.out.println(“1차 배열 항목값 비교 : ” + Arrays.equals(original, cloned1));
System.out.println(“중첩배열 항목값 비교 : ” + Arrays.deepEquals(original, cloned1));
// 깊은 복사 후 비교
System.out.println(“\n [깊은 복제 후 비교]”);
int[][] cloned2 = Arrays.copyOf(original, original.length);
cloned2[0] = Arrays.copyOf(original[0], original[0].length);
cloned2[1] = Arrays.copyOf(original[1], original[1].length);
System.out.println(“배열 번지 비교 : ” + original.equals(cloned2));
System.out.println(“1차 배열 항목값 비교 : ” + Arrays.equals(original, cloned2));
System.out.println(“중첩배열 항목값 비교 : ” + Arrays.deepEquals(original, cloned2));
}
}
3. 배열 항목 정렬
기본 타입 또는 String 배열은 Arrays.sort() 메소드의 매개값으로 지정해주면 자동으로 오름차순 정렬이 된다.
사용자 정의 클래스 타입일 경우에는 클래스가 Comparable 인터페이스를 구현하고 있어야 정렬된다.
예) Member 배열에서 Member 객체들을 name 필드값으로 정렬 시 Member.java : Comparable 구현 클래스
public class Member implements Comparable<Member> {
String name;
Member(String name) {
this.name = name;
}
@Override
public int compareTo(Member o) {
return name.compareTo(o.name);
}
}
Comparable<Member> : Member 타입만 비교하기 위해 제네릭 <> 사용
compareTo() : 비교값을 리턴하도록 오버라이딩
오름차순일 때 자신이 매개값 보다 낮을 경우 음수, 같을 경우 0, 높을 경우 양수를 리턴하면 된다.
내림차순일 때 자신이 매개값 보다 낮을 경우 양수, 같은 경우 0, 높은 경우 음수를 리턴한다.
name 필드 값으로 정렬하므로 유니코드를 비교해야 한다.
String 의 compareTo() 리턴값을 사용한다.
예) SortExample.java : 배열 비교
public class SortExample {
public static void main(String[] args) {
int[] scores = { 99, 97, 98 };
Arrays.sort(scores); // 오름차순 정렬
for(int i = 0; i < scores.length; i++) {
System.out.println(“socres[” + i + “] = ” + scores[i]);
}
System.out.println();
String[] names = { “홍길동”, “박동수”, “김민수” };
Arrays.sort(names); // 오름차순 정렬
for(int i = 0; i < names.length; i++) {
System.out.println(“names[” + i + “] = ” + names[i]);
}
System.out.println();
Member m1 = new Member(“홍길동”);
Member m2 = new Member(“박동수”);
Member m3 = new Member(“김민수”);
Member[] members = { m1, m2, m3 };
Arrays.sort(members); // 오름차순 정렬
for(int i = 0; i < members.length; i++) {
System.out.println(“members[” + i + “].name = ” + members[i].name);
}
}
}
4. 배열 항목 검색
배열 항목에서 특정 값이 위치한 인덱스를 얻는 것
Arrays.sort() 메소드로 항목들을 오름차순으로 정렬한 후, Arrays.binarySearch() 메소드로 항목을 찾는다.
예) SearchExample.java : 배열 검색
public class SearchExample {
public static void main(String[] args) {
// 기본 타입값 검색
int[] scores = { 99, 97, 98 };
Arrays.sort(scores); // 오름차순 정렬
int index = Arrays.binarySearch(scores, 99);
System.out.println(“찾은 인덱스 : ” + index);
// 문자열 검색
String[] names = { “홍길동”, “박동수”, “김민수” };
Arrays.sort(names);
index = Arrays.binarySearch(names, “홍길동”); // 2
System.out.println(“찾은 인덱스 : ” + index);
// 객체 검색
Member m1 = new Member(“홍길동”);
Member m2 = new Member(“박동수”);
Member m3 = new Member(“김민수”);
Member[] members = { m1, m2, m3 };
Arrays.sort(members);
index = Arrays.binarySearch(member, m1); // 2
System.out.println(“찾은 인덱스 : ” + index);
}
}
'Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어] > 9. 기본 API 클래스' 카테고리의 다른 글
13. Java 자바 [API] - Math, Random 클래스 (0) | 2020.09.29 |
---|---|
12. Java 자바 [API] - Wrapper (포장) 클래스 (0) | 2020.09.29 |
10. Java 자바 [API] - 정규 표현식, Pattern 클래스 (0) | 2020.09.24 |
9. Java 자바 [API] - StringBuffer, StringBuilder 클래스 (0) | 2020.09.24 |
8. Java 자바 [API] - StringTokenizer 클래스 (0) | 2020.09.24 |