자바

JAVA 자바 Arrays 클래스 : 배열 복사, 배열 항목 비교, 배열 항목 정렬 Arrays.sort() , 배열 항목 검색 Arrays.binarySearch()

알통몬_ 2017. 3. 15. 10:46
반응형

안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^ 


Arrays 클래스

  배열 조작 기능을 가지고 있습니다. 

배열 조작이란 : 배열의 복사, 항목 정렬, 항목 검색과 같은 기능. 

단순한 배열의 복사는 System.arrayCopy() 메서드를 사용할 수 있지만,

Arrays는 추가적으로 항목 정렬, 항목 검색, 항목 비교와 같은 기능을 제공해 줍니다.


전부 static 메서드이므로 Arrays 클래스로 바로 사용이 가능합니다.



배열 복사

copyOf(원본 배열, 복사할 길이), copyOfRange(원본배열, 시작인덱스, 끝인덱스)

 copyOf() 메서드는 원본 배열의 0번 인덱스에서 복사할 길이만큼 복사할 타겟 배열을 리턴합니다. 

복사할 길이는 원본 배열의 길이보다 커도 되고, 타겟 배열의 길이기 됩니다. 

ex)

 char[] arr1 = {'J' , 'A' , 'V' , 'A'};

 char[] arr2 = Arrays.copyOf(arr2, arr2.length);

위 코드는 arr1[] 배열의 전체 항목을 복사해서 arr2[] 배열을 생성하는 코드입니다.


copyOfRange(원본배열, 시작인덱스, 끝인덱스)는 원본 배열의 시작 인덱스에서 끝 인덱스까지 복사한 배열을 리턴합니다. 시작 인덱스는 포함이고 끝 인덱스는 포함하지 않습니다. 

ex)

 char[] arr1 = {'J' , 'A' , 'V' , 'A'};

 char[] arr2 = Arrays.copyOf(arr1, 0,3);

'J' , 'A' , 'V' , 'A' 중에 'J' , 'A' , 'V'만 복사됩니다. 


단순히 배열을 복사할 목적으로 사용하는 System.arraycopy()메서드와 위 메서드들의 사용 에제를 보겠습니다.System.arraycopy()메서드는 5개의 매개 값이 필요합니다.

System.arraycopy(Object o,    int start,    Object o2,    int end, int length)

                     원본 배열 시작인덱스 타겟배열 타겟 시작인덱스 복사개수

예제)

import java.util.Arrays;


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<arr4.length; i++) {

System.out.println("arr4[" + i + "]=" + arr4[i]);

}

}

}

 


 


배열 항목 비교

 equals() 와 deepEquals()는 배열 항목을 비교합니다. 

Arrays.equals()는 1차 항목의 값만 비교합니다.

Arrays.deepEquals()는 중첩된 배열의 항목까지 비교합니다.

예제)

import java.util.Arrays;


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));

}

 

}

 



=========================================================================================

배열 항목 정렬 Arrays.sort()

 기본 타입이나 String 배열은 Arrays.sort() 메서드의 매개값으로 지정해주면 

자동으로 오름차순 정렬이 됩니다. 

사용자 정의 클래스 타입의 경우에는 클래스가 Comparable 인터페이스를 구현하고 있어야

정렬이 됩니다.

Member 배열에서 Member 객체들을 name 값으로 정렬하고 싶다면 아래 코드처럼 작성하면 됩니다.

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); // 리턴 값은 오름 차순일 때 자신이 매개 값보다 낮을 경우 음수, 같을 경우 0, 높을 경우 양수를 리턴하도록 하고, 내림 차순일 경우 반대로 하면 됩니다. 

  }

}


아래 예제는 Arrays.sort() 메서드를 사용해서 배열 항목을 정렬하는 예제 입니다. 위의 멤버 클래스가 있어야 실행 가능합니다.

예제)

import java.util.Arrays;


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("scores[" + 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);

}

}

 

}




배열 항목 검색 Arrays.binarySearch()

 배열 항목을 검색 하려면 먼저 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);

}

}

 

 

반응형