본문 바로가기

# 02/Java

[윤성우 열혈자바] 20-4. Arrays 클래스

반응형

Arrays 클래스의 배열 복사 메소드


public static int[] copyOf (int[] original, int newLength)


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




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


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



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


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









copyOf 메소드 호출의 예


public static void main(String[] args) {


double[] arOrg = {1.1, 2.2, 3.3, 4.4, 5.5};



// 배열 전체를 복사

double[] arCpy1 = Arrays.copyOf (arOrg, arOrg.length);



// 세번째 요소까지만 복사

double[] arCpy2 = Arrays.copyOf (arOrg, 3);



for (double d : arCpy1)

System.out.print(d + "\t");

System.out.println();



for (double d : arCpy2)

System.out.print(d + "\t");

System.out.println();


}










arrayCopy 메소드 호출의 예


public static void main (String[] args) {


double[] org = {1.1, 2.2, 3.3, 4.4, 5.5};

double[] cpy = new double[3];                    // 미리 배열 만들어 놔야됨!!!!



// 배열 org의 인덱스 1에서 배열 cpy 인덱스 0으로 세 개의 요소 복사

System.arraycopy(org, 1, cpy, 0, 3);



for (double d : cpy)

System.out.print(d + "\t");

System.out.println();


}











두 배열의 내용 비교


public static boolean equals (int[] a, int[] a2)


-> 매개변수 a와 a2로 전달된 배열의 내용을 비교하여 true 또는 false 반환



public static void main(String[] args) {

int[] ar1 = {1, 2, 3, 4, 5};

int[] ar2 = Arrays.copyOf(ar1, ar1.length);


System.out.println(Arrays.equals(ar1, ar2));


}











인스턴스 저장 배열의 비교 예


class INum {

private int num;

public INum (int num) {


this.num = num;


}

}




class ArrayObjEquals {


public static void main(String[] args) {

INum[] ar1 = new INum[3];

INum[] ar2 = new INum[3];

ar1[0] = new INum(1);

ar1[1] = new INum(2);

ar1[2] = new INum(3);

ar2[0] = new INum(1);

ar2[1] = new INum(2);

ar2[2] = new INum(3);

System.out.println(Arrays.equals(ar1, ar2));

}

}




 결과가 의미하는 바는? 어떤 식으로 비교?


equals는 Object의 메소드로 인스턴스를 비교한다. 


배열은 각각 해당하는 원소의 인스턴스를 비교하는데 모두 new Num 으로 인스턴스 새로 생성했기 때문에 인스턴스가 다르다. 


따라서 false.


만약 인스턴스 비교가 아닌 값 비교를 하고 싶을때(String 처럼) INum 클래스 안에 equals 메소드를 오버라이드 해줘야됨!!








Arrays의 equals 메소드가 내용을 비교하는 방식


public static boolean equals (Object[] a, Object[] a2)



다음은 실제 Java의 Arrays.equals 메소드의 일부!


for ( int i = 0; i < length; i++ ) {

Object o1 = a[i];

Object o2 = a2[i];


if (!(o1 == null ? o2 == null : o1.equals(o2)))

return false;

} 






각 요소별로 Object 클래스의 equals 메소드로 비교








Object 클래스의 equals 메소드는?


public boolean equals(Object obj) {


if (this == obj)            // 두 인스턴스가 동일 인스턴스이면

return true;


else 

return false;

}                                // 이렇듯 Object 클래스에 정의된 equals 메소드는 참조 값 비교를 한다.





따라서 Arrays 클래스의 equals 메소드가 두 배열의 내용 비교를 하도록 하려면 


비교 대상의 equals 메소드를 내용 비교의 형태로 오버라이딩 해야 한다.








Object 클래스의 equals 메소드 오버라이딩 결과


class INum {

private int num;

public INum(int num) {

this.num = num;

}


@Override

public boolean equals (Object obj) {

if (this.num == ((INum)obj.num)

return true;

else

return false;

}

}


public static void main (String[] args) {

INum[] ar1 = new INum[3];

INum[] ar2 = new INum[3];

ar1[0] = new INum(1);

ar1[1] = new INum(2);

ar1[2] = new INum(3);

ar2[0] = new INum(1);

ar2[1] = new INum(2);

ar2[2] = new INum(3);

System.out.println(Arrays.equals(ar1, ar2));

}


true 반환








배열의 정렬 : Arrays 클래스의 sort 메소드


public static void sort (int[] a)

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



public static void main(String[] args) {


int[] ar1 = {1, 5, 3, 2, 4};

double[] ar2 = {3.3, 2.2, 5.5, 1.1, 4.4};

Arrays.sort(ar1);

Arrays.sort(ar2);


for (int n : ar1)

System.out.print(n + "\t");

System.out.println();


for (double d : ar2)

System.out.print(d+ "\t");

System.out.println();


}










compareTo 메소드 정의 기준


interface Compareble


-> int compareTo(Object o)




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


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


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








클래스에 정의하는 오름차순 기준


Comparable 인터페이스를 구현한다는 것은 오름차순 순서상 크고 작음에 대한 기준을 제공한다는 의미


class Person implements Comparable {

private String name;

private int age;


. . . .


나이가 어릴수록 오름차순 순서상 작은 것으로 정의됨

@Override

public int comparaTo(Object o) {

Person p = (Person) o;

if ( this.age > p.age )

return 1;

else if (this.age < p.age)

return -1;

else

return 0;

}

. . . .

}








다음과 같이 구현도 가능!


public int compareTo(Object o) {

Person p = (Person) o;


if (this.age > p.age)

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

else if (this.age < p.age)

return -1;            // 인자로 전달된 o가 크다면 음의 정수 반환

else

return 0;            // 인자로 전달된 o와 같다면 0을 반환

}



-> 위의 코드 대신 간편하게 다음과 같이 작성 가능!!!



public int compareTo(Object o) {


Person p = (Person) o;

return this.age - p.age;


}








배열에 저장된 인스턴스들의 정렬의 예


class Person implements Comparable {

private String name;

private int age;


public Person (String name, int age) {

this.name = name;

this.age = age;

}


public int compareTo(Objetc o) {

Person p = (Person) o;

return this.age - p.age;

}


public String toString() {

return name + ": " + age;

}

}


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


}










배열의 탐색 : 기본 자료형 값 대상


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


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




binarySearch 는 이진 탐색을 진행!


그리고 이진 탐색을 위해서는 탐색 이전에 데이터들이 오름차순으로 정렬되어 있어야 한다.








배열의 탐색 : 기본 자료형 값 대상의 예


class ArraySearch {

public static void main(String[] args) {

int[] ar = {33, 55, 11, 44, 22};

Arrays.sort(ar);            // 탐색 이전에 정렬이 선행되어야 한다.


for (int n : ar)

System.out.print(n + "\t");

System.out.println();


int idx = Arrays.binarySearch(ar, 33);        // 배열 ar에서 33을 찾아라.

System.out.println("Index of 33 : " + idx);

}

}












배열의 탐색 : 인스턴스 대상


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



마찬가지로 탐색 대상들은 오름차순으로 정렬되어 있어야 한다.


그리고 탐색 대상의 확인 여부는 compareTo 메소드의 호출 결과를 근거로 한다.


즉, 탐색 방식은 인스턴스의 내용 비교이다!









배열의 탐색 : 인스턴스 대상의 예


class Person implements Comparable {

private String name;

private String age;


. . .


@Override

public int compareTo(Object o) {

Person p = (Person) o;

return this.age - p.age;        // 나이가 같으면 0을 반환

}

. . .


}




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);                        // 탐색에 앞서 정렬을 진행

int idx = Arrays.binarySearch(ar, new Person("Who are you?", 37));

System.out.println(ar[idx]);

}





반응형