11.11 Arrays 클래스
Arrays 클래스는 배열 조작 기능을 가지고 있다. 배열 조작이란 배열의 복사, 항목 정렬, 항목 검색과 같은 기능을 말한다. 단순한 배열 복사는 System.arraycopy() 메소들르 사용할 수 있으나, Arrays는 추가적으로 항목 정렬, 항목 검색, 항목 비교와 같은 기능을 제공해준다. 다음은 Arrays클래스가 가지고 있는 메소들이다. 메소드 이름만 보면 어떤 기능을 제공하는지 쉽게 알 수 있다. Arrays 클래스의 모든 메소드는 정적(static) 이므로 Arrays 클래스로 바로 사용이 가능하다.
리턴타입 | 메소드이름 | 설명 |
int | binarySearch(배열, 찾는값) | 전체 배열 항목에서 찾는 값이 인덱스 리턴 |
타겟 배열 | copyOf(원본배열, 복사할길이) |
원본 배열의 0번 인덱스에서 복사할 길이만큼 복사한 배열 리턴, 복사할 길이는 원본 배열의 길이보다 커도 되며, 배열의 길이가 된다. |
타겟 배열 | copyOfRange(원본배열,시갖인덱스, 끝인덱스) | 원본 배열의 시작 인덱스에서 끝 인덱스가지 복사한 배열 리턴 |
boolean | deepEquals(배열, 배열) |
두 배열의 깊은 비교 (중첩 배열의 항목까지 비교) |
boolean | equals(배열, 배열) |
두 배열의 얕은 비교 (중첩 배열의 항목은 비교하지 않음) |
void | fill(배열, 값) | 전체 배열 항목에 동일한 값을 저장 |
void | fill(배열, 시작인덱스, 끝인덱스, 값) | 시작 인덱스부터 끝 인덱스까지 항목에만 동일한 값을 저장 |
void | sort(배열) | 배열의 전체 항목을 오름차순으로 정렬 |
String | toString(배열) | "[값1,값2,..]"와 같은 문자열 리턴 |
11.11.1 배열 복사
배열 복사를 위해 사용할 수 있는 메소드는 copyOf(원본배열, 복사할 길이) , copyOfRange(원본배열, 시작인덱스, 끝인덱스) 이다. copyOf() 메소드는 원본 배열의 0번 인덱스에서 복사할 길이만큼 복사한 타겟 배열을 리턴하는데, 복사할 길이는 원본 배열의 길이보다 커도 되며, 타겟 배열의 길이가 된다. 다음은 arra[]배열의 전체 항목을 복사해서 arr2[]배열을 생성한다.
char[] arr1 ={'J', 'A', 'V', 'A' };
char[] arr2 =Arrays.copyOf(arr1, arr1.length);
copyOfRange(원본배열, 시작인덱스, 끝인덱스) 는 원본 배열의 시작 인덱스에서 끝 인덱스까지 복사한 배열을 리턴한다. 시작 인덱스는 포함되지만, 끝 인덱스는 포함되지 않는다. 다음은 arr1[] 배열 항목 중 1번, 2번 인덱스 항목을 arr2[] 배열의 0번, 1번 인덱스 항목으로 복사한다.
char[] arr1 ={'J', 'A', 'V', 'A' };
char[] arr2 =Arrays.copyOfRange(arr1, 1, 3);
단순히 배열을 복사할 목적이라면 Arrays 클래스를 사용하지 않고 System.arraycopy() 메소드를 이용할 수 있다. System.arraycopy() 메소드는 다음과 같이 5개의 매개값이 필요하다.
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length );
원본 시작 인덱스는 원본 배열에서 복사할 항목의 시작 위치이고, 타겟 시작 인덱스는 타겟 배열에서의 복사 시작 위치를 말한다 복사 개수는 원본 시작 인덱스에서부터 몇 개의 항목을 복사할 것인지를 말한다. 예를 들어 array (arr1, 1, arr2, 3, 3) 는 다음과 같이 복사된다.
다음은 Arrays 와 System.arraycopy() 메소드를 이용해서 배열을 복사하고 있다.
public class ArrayCopyExample {
public static void main(String[] args) {
char[] arr1 = {'J', 'A', 'V', 'A'};
//방법1
char[] arr2 =Arrays.copyOf(arr1, arr1.length);
System.out.println(Arrays.toString(arr2));
//방법2
char[] arr3 =Arrays.copyOfRange(arr1, 1, 3);
System.out.println(Arrays.toString(arr3));
//방법3
char[] arr4 =new char[arr1.length];
System.arraycopy(arr1, 0, arr4, 0, arr1.length);
for(int i=0; i System.out.println("arr4[" + i+ "]=" + arr4[i]);
}
}
}
[J, A, V, A]
[A, V]
arr4[0]=J
arr4[1]=A
arr4[2]=V
arr4[3]=A
11.11.2 배열 항목 비교
Arrays의 equals() 와 deepEquals() 는 배열 항목을 비교한다. Arrays.equals() 는 1차 항목의 값만 비교하고, deepEquals() 는 중첩된 배열의 항목까지 비교한다. 다음 예제는 배열 복사 후 항목을 비교한다.
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));
}
}
[얕은 복제후 비교]
배열 번지 비교 : false
1차 배열 항목값 비교 : true
중첩 배열 항목값 비교 : true
[깊은 복제 후 비교]
배열 번지 비교 : false
1차 배열 항목값 비교 : false
중첩 배열 항목값 비교 : true
11.11.3 배열 항목 정렬
기본 타입 또는 String 배열은 Arrays.sort() 메소드의 매개값으로 지정해주면 자동으로 오름차순 정렬이 된다. 사용자 정의 클래스 타입일 경우에는 클래스가 Comparable 인터페이스를 구현하고 있어야 정렬이 된다. Member 배열에셔 Member 객체들을 name 필드값으로 정렬하고 싶다면
다음과 같이 Memebr 클래스를 작성하면 된다.
public class Member implements Comparable{
String name;
Member (String name){
this.name =name;
}
@Override
public int compareTo(Member o) {
// TODO Auto-generated method stub
return name.compareTo(o.name);
}
}
Comparable 는 Member 타입만 비교하기 위해 제네릭 <> 을 사용하였고, comareTo() 메소드는 비교값을 리턴하도록 오버라이딩했다.
compareTo() 메소드의 리턴값은 오름차순일 때 자신이 매개값보다 낮을 경우 음수, 같을 경우 0, 높을 경우 양수를 리턴하면 된다. 반대로 내림차순일 때 자신이 매개값보다 낮을 경우 양수, 같은 경우 0 , 높을 경우 음수를 리턴하면 된다. name 필드값으로 정렬한다고 했으니 유니코드로 비교를 해야 하므로 String 의 compareTo() 리턴값을 사용하였다. 다음 예제는 배열 항목을 정렬하는 방법을 보여준다.
public class SortExample {
public static void main(String[] args) {
int[] scores ={99,97, 98};
Arrays.sort(scores);
for(int i=0; i System.out.println("scores[" + i +"]=" + scores[i]);
}
System.out.println();
String[] names ={"홍길동", "박동수", "김민수" };
Arrays.sort(names);
for(int i=0; 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 System.out.println("members[" + i + "].name=" + members[i].name);
}
}
}
11.11.3 배열 항목 검색
배열 항목에서 특정 값이 위치한 인덱스를 얻는 것을 배열 검색이라고 한다. 배열 항목을 검색하려면 먼저 Arrays.sort() 메소드를 항목을 오름차순으로 정렬한 후 , Arrays.binarySearch() 메소드로 항목을 찾아야 한다. 다음 예제는 배열 항목을 검색하는 방법을 보여준다.
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, "홍길동");
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(members, m1);
System.out.println("찾은 인덱스 :" + index);
}
}
찾은 인덱스 :2
찾은 인덱스 :2
찾은 인덱스 :2
댓글 ( 4)
댓글 남기기