Keep going

Arrays 클래스 본문

Records/JAVA

Arrays 클래스

코딩천재홍 2021. 1. 3. 21:00

java.util.Arrays 클래스는 배열 조작에 도움을 주는 메소드들로 채워져 있다. 

이 클래스에 정의된 메소드들을 사용하면 배열의 복사, 비교, 정렬 및 탐색과 관련된 코드를 비교적 쉽게 작성할 수 있다. 

 

<배열의 복사>

배열 복사에 사용되는 Arrays 클래스의 메소드다.  모든 기본 자료형 배열에는 이 메소드가 오버 라이딩 되어있다.

public static int[] copy of( int[] original, int new Length)

→ original에 전달된 배열을 첫 번째 요소부터 newLength의 길이만큼 복사 

 

public static int[] copyofRange(int[] original , int from, int to)

→ origianl에 전달된 배열을 인덱스 from부터 to 이전 요소까지 복사

 

import java.util.*;
 
public class copyofArrays {
    public static void main(String[] args) {
        double[] arOrg = { 1.12.23.04.05.0 };
        double[] arCpy1 = Arrays.copyOf(arOrg, arOrg.length);
        for (double d : arCpy1)
            System.out.print(d + "  ");
        System.out.println();
 
        double[] arCpy2 = Arrays.copyOfRange(arOrg, 03);
        for (double d : arCpy2)
            System.out.print(d + "  ");
        System.out.println();
    }
}
 
cs

 

실행 결과

 

추가로 위와 다르게 배열을 새로 생성하지 않고 존재하는 배열에 복사를 하는 경우에는 java.lang.System 클래스의 다음 메소드를 호출하면 된다.

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

→ 배열 src의 srcPos에서 배열 dest의 destPos로 length 길이만큼 복사

 

import java.util.*;
public class CopyOfSystem {
    public static void main(String[] args) {
        double [] org = {1.12.23.34.45.5};
        double [] cpy = new double[3];
        
        System.arraycopy(org, 0, cpy, 03);
        
        for(double d : cpy)
            System.out.print(d+"  ");
        System.out.println();
    }
}
 
cs

실행결과

 


<배열의 정렬>

배열의 정렬에 사용되는 Arrays 클래스의 메소드는 다음과 같다.

기본적으로 모든 기본 자료형의 배열에는 이 메소드가 오버로딩 되어 있다.

 

public static void sort(int[] a)

→ 매개변수 a로 전달된 배열을 오름차순으로 정렬

import java.util.Arrays;
 
public class ArraySort {
    public static void main(String[] args) {
        int[] ar = { 15324 };
        Arrays.sort(ar);
 
        for (int i : ar)
            System.out.print(i + "  ");
 
    }
}
 
cs

 

실행 결과

 

sort 메소드는 Object 배열에 대해서도 오버로딩 되어 있다.

public static void sort(Object[] a)

 

이는 인스턴스의 참조 값을 저장하고 있는 배열에 대한 정렬을 진행한다. 

그렇다면 인스턴스의 순서는 어떻게 판단을 할까?

이는 프로그래머가 Comparable이라는 인터페이스의 구현을 기반으로 결정할 수 있다.

 

interface Comparable

→ int compareTo(Object o) 메소드 구현을 통해 인스턴스의 순서 판단 기준을 결정

 

추상 메소드 compareTo의 구현 방법

1. 인자로 전달된 o가 작다면 양의 정수 반환

2. 인자로 전달된 o가 크다면 음의 정수 반환

3. 인자로 전달된 o와 같다면 0을 반환

import java.util.Arrays;
 
class Person implements Comparable {
    private String name;
    private int age;
 
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    @Override
    public int compareTo(Object o) {
        Person p = (Person) o;
        if (this.age > p.age)
            return 1;
        else if (this.age < p.age)
            return -1;
        else
            return 0;
    }
 
    @Override
    public String toString() {
        return name + ", " + age;
    }
}
 
public class ArrayObjSort {
    public static void main(String[] args) {
        Person[] ar = new Person[3];
        ar[0= new Person("Lee"29);
        ar[1= new Person("Goo"15);
        ar[2= new Person("Soo"37);
 
        Arrays.sort(ar);
        for (Person p : ar)
            System.out.println(p);
    }
 
}
 
cs

실행결과

 


<배열의 탐색>

아래 메소드 역시 Arrays 클래스의 다른 메소드들과 마찬가지로 모든 기본 자료형의 배열에 오버로딩 되어 있다.

public static int binarySearch(int[] a, int key)

→ 배열 a에서 key를 찾아서 있으면 key 의 인덱스 값, 없으면 0보다 작은 수 반환  

  없는 경우 반환값은 삽입 포인트를 x라고 할 때 -x-1을 반환한다. 

 

그렇다면 이 메소드가 key 와 동일한 인스턴슬르 찾았다고 판단하는 기준은 무엇인가? Comparable 인터페이스의 compareTo 메소드가 그 기준이다. compareTo 메소드의 호출을 통해서 0이 반환되면 key 와 해당하는 인스턴스를 찾았다고 판단한다.

 

import java.util.Arrays;
 
class Person1 implements Comparable {
    private String name;
    private int age;
 
    public Person1(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    @Override
    public int compareTo(Object o) {
        Person1 p = (Person1) o;
        return this.age - p.age;
    }
 
    @Override
    public String toString() {
        return name + ", " + age;
    }
}
 
public class ArrayObjSearch {
    public static void main(String[] args) {
        Person1[] ar = new Person1[3];
        ar[0= new Person1("Lee"29);
        ar[1= new Person1("Goo"15);
        ar[2= new Person1("Soo"37);
        Arrays.sort(ar);
 
        int index = Arrays.binarySearch(ar, new Person1(" "37));
        System.out.println(ar[index]);
    }
}
 
cs

정리하면, binarySearch 메소드를 통해 인스턴스를 찾고자 하는 경우, 탐색의 대상이 되는 인스턴스들의 클래스는 Comparable 인터페이스를 구현한 상태이어야 한다. 이는 compareTo 메소드의 구현 내용을 토대로 탐색이 진행되기 때문이다.

 

실행결과 

 

 


출처 : 윤성우의 열혈 JAVA 프로그래밍 [윤성우 (오렌지 미디어)]

'Records > JAVA' 카테고리의 다른 글

예외 처리  (0) 2021.01.04
Comments