본문 바로가기

Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어]/9. 기본 API 클래스

11. Java 자바 [API] - Arrays 클래스

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