Arrays 클래스
- java.util.Arrays
- Arrays 클래스에는 배열을 다루기 위한 다양한 메소드가 포함되어 있다.
- Arrays 클래스의 모든 메소드는 클래스 메소드(static method)이므로, 객체를 생성하지 않고 바로 사용가능하다.
배열 복사 메소드
copyOf
public static int[] copyOf(int[] original, int newLength)
- 전달받은 배열의 특정 길이만큼을 새로운 배열로 복사하여 반환한다. (복제의 개념)
- original에 전달된 배열을 첫번째 요소부터 newLength의 길이만큼 복사한다.
- 새로운 배열의 길이가 원본 배열보다 길면, 나머지 요소는 배열 요소의 타입에 맞게 기본 값으로 채워진다.
배열 요소의 타입 | 기본 값 |
byte, short, int | 0 |
long | 0L |
float | 0.0F |
double | 0.0 또는 0.0D |
boolean | false |
char | '\u000' |
배열, 인스턴스 등 | null |
class ArraysClassCopyOf {
public static void main(String[] args) {
int[] arOrigin = {1, 2, 3, 4, 5};
// 배열 전체를 복사
int[] arCopy1 = Arrays.copyOf(arOrigin, arOrigin.length);
// 세번째 요소까지만 복사
int[] arCopy2 = Arrays.copyOf(arOrigin, 3);
// 새로운 배열의 길이가 원본 배열의 길이보다 길 경우
int[] arCopy3 = Arrays.copyOf(arOrigin, 8);
for(int d : arCopy1)
System.out.print(d + "\t");
System.out.println();
for(int d : arCopy2)
System.out.print(d + "\t");
System.out.println();
for(int d : arCopy3)
System.out.print(d + "\t");
System.out.println();
}
}
// 실행 결과
1 2 3 4 5
1 2 3
1 2 3 4 5 0 0 0
copyOfRange
/**
* original: 원본 배열
* from: 원본 배열에서 복사할 시작 인덱스
* to: 복사될 배열 요소의 바로 다음 인덱스 (to-1 인덱스까지 복사 진행)
*/
public static int[] copyOfRange(int[] original, int from, int to)
- 전달받은 배열의 특정 범위에 해당하는 요소만을 새로운 배열로 복사하여 반환한다.
- 원본 배열과 같은 타입의 복사된 새로운 배열을 반환한다. (복제의 개념)
class ArraysClassCopyOfRange {
public static void main(String[] args) {
int[] org = {1, 2, 3, 4, 5};
int[] cpy = Arrays.copyOfRange(org, 1, 4);
for(int d : cpy)
System.out.print(d + "\t");
}
}
// 실행 결과
2 3 4
arraycopy
/**
* src: 원본 배열
* srcPos: 복사 시작 인덱스
* dest: 새로운 배열
* destPost: 붙여넣을 시작 인덱스
* length: 복사할 요소의 개수
*/
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
- 원본 배열의 srcPos에서 새로운 배열의 destPost로 length 길이만큼 복사하여 반환한다.
class ArraysClassArrayCopy {
public static void main(String[] args) {
int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = new int[3];
// 배열 org의 인덱스 1에서 배열 cpy 인덱스 0으로 세개의 요소 복사
System.arraycopy(arr1, 1, arr2, 0, 3);
for(int d : arr2)
System.out.print(d + "\t");
}
}
// 실행 결과
2 3 4
배열 비교 메소드
equlas
public static boolean equals(int[] a1, int[] a2)
- 전달받은 두 배열이 같은지를 확인하는 메소드이다.
- 매개변수 a1, a2로 전달된 배열의 내용을 비교하여 true 또는 flase로 반환한다.
class ArraysClassEquals {
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)); // true
}
}
Object형 배열의 equals
- equals 메소드는 Object형 배열에 대해서도 오버로딩 되어있다.
- 두 배열이 저장하고 있는 인스턴스의 참조 값을 비교한다.
- 배열의 참조 값 비교가 아닌 내용 비교가 목적이라면 equals 메소드를 목적에 맞게 오버라이딩 해야 한다.
class MakeNum {
private int num;
public MakeNum(int num) {
this.num = num;
}
}
class ArrayObjectEquals {
public static void main(String[] args) {
MakeNum[] ar1 = new MakeNum[3]; // 길이가 3인 배열 생성
MakeNum[] ar2 = new MakeNum[3]; // 길이가 3인 배열 생성
ar1[0] = new MakeNum(1);
ar1[1] = new MakeNum(2);
ar1[2] = new MakeNum(3);
ar2[0] = new MakeNum(1);
ar2[1] = new MakeNum(2);
ar2[2] = new MakeNum(3);
System.out.println(Arrays.equals(ar1, ar2)); // false
}
}
class MakeNum {
private int num;
public MakeNum(int num) {
this.num = num;
}
@Override
public boolean equals(Object obj) {
if(this.num == ((MakeNum)obj).num) // 두 인스턴스의 내옹 비교
return true;
else
return false;
}
}
class ArrayObjectEquals {
public static void main(String[] args) {
MakeNum[] ar1 = new MakeNum[3]; // 길이가 3인 배열 생성
MakeNum[] ar2 = new MakeNum[3]; // 길이가 3인 배열 생성
// 각 배열에 인스턴스 저장
ar1[0] = new MakeNum(1);
ar1[1] = new MakeNum(2);
ar1[2] = new MakeNum(3);
// 각 배열에 인스턴스 저장
ar2[0] = new MakeNum(1);
ar2[1] = new MakeNum(2);
ar2[2] = new MakeNum(3);
System.out.println(Arrays.equals(ar1, ar2)); // true
}
}
배열 정렬 메소드
sort
public static void sort(int[] a)
- 전달받은 배열의 모든 요소를 오름차순(작은→ 큰)으로 정렬한다.
- 매개변수로 정렬할 배열을 전달받으며, 전달받은 원본 배열의 순서를 변경하게 된다.
class ArrayClassSort {
public static void main(String[] args) {
int[] ar1 = {3, 1, 2};
double[] ar2 = {1.1, 3.3, 2.2};
Arrays.sort(ar1); // 배열 오름차순 정렬
Arrays.sort(ar2); // 배열 오름차순 정렬
System.out.println("ar1: " + Arrays.toString(ar1));
System.out.println("ar2: " + Arrays.toString(ar2));
}
}
// 실행 결과
ar1: [1, 2, 3]
ar2: [1.1, 2.2, 3.3]
Object형 배열의 sort
기본자료형이 담긴 배열에서의 순서비교는 쉽지만, 객체(인스턴스)의 참조값이 담긴 배열에서의 순서비교는 어렵다.
정렬 기준이 없으면 정렬을 할 수 없으며, 따라서 정렬 기준을 정의하여 알려줘야 한다.
- sort 메소드는 Object형 배열에 대해서도 오버로딩 되어있다.
- 객체(인스턴스)의 정렬 기준을 정의하려면 comparable 인터페이스를 구현해줘야 한다.
- comparable 인터페이스의 compareTo( ) 메소드 구현을 통해 객체의 순서 판단 기준을 결정한다.
- int compareTo(Object o)
- 메소드를 호출하는 객체가 인자로 전달된 o보다 크다면 양수 반환
- 메소드를 호출하는 객체가 인자로 전달된 o보다 작다면 음수 반환
- 메소드를 호출하는 객체와 인자로 전달된 o이 같다면 0 반환
- 이 메소드를 통해 반환되는 값을 기준으로 Arrays.sort 메소드가 정렬을 진행한다.
- int compareTo(Object o)
class Person implements Comparable { // Comarable 인터페이스를 구현
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; // 인자로 전달된 o가 작다면 양수 반환
else if (this.age < p.age)
return -1; // 인자로 전달된 o가 크다면 음수 반환
else
return 0; // 인자로 전달된 o와 같다면 0 반환
}
@Override
public String toString() {
return name + " : " + age;
}
}
public class ArrayObjectSort {
public static void main(String[] args) {
Person[] ar = new Person[4];
ar[0] = new Person("wuga", 26);
ar[1] = new Person("june", 27);
ar[2] = new Person("hyeon", 25);
ar[3] = new Person("anne", 26);
Arrays.sort(ar);
for(Person p : ar)
System.out.println(p);
}
}
// 실행 결과
hyeon : 25
wuga : 26
anne : 26
june : 27
compareTo 메소드는 다음과 같이 간단하게 정의할 수도 있다.
public int compareTo(Object o) {
Person p = (Person)o;
return this.age - p.age;
}
배열 탐색 메소드
binarySearch
public static int binarySearch(int[] a, int key)
- 배열 a에서 key를 찾아서 있으면 key의 인덱스 값을 반환, 없으면 음수를 반환한다.
- 전달받은 배열에서 특정 객체의 위치를 이진탐색 알고리즘을 사용해 검색한 후, 해당 위치를 반환한다.
- binarySearch 메소드는 이진탐색 알고리즘을 사용하므로, 매개변수로 전달되는 배열이 sort() 메소드 등을 사용해 미리 정렬되어 있어야만 제대로 동작한다.
public class ArraysClassSearch {
public static void main(String[] args) {
int[] ar = {1, 3, 4, 2, 5};
Arrays.sort(ar); // 탐색 이전에 정렬이 선행되어야 한다.
System.out.println(Arrays.toString(ar));
int idx = Arrays.binarySearch(ar, 3); // 배열 ar에서 3을 찾아라.
System.out.println("Index of 3: " + idx);
}
}
// 실행 결과
[1, 2, 3, 4, 5]
Index of 3: 2
binarySearch 메소드가 동일한 객체를 찾았다고 판단하는 기준은 Comparable 인터페이스의 compareTo 메소드이다.
- comparaTo 메소드 호출을 통해 0이 반환되면 동일한 객체를 찾았다고 판단한다.
- binarySearch 메소드는 comparaTo 메소드의 구현 내용을 토대로 탐색이 진행되기 때문에 탐색의 대상이 되는 객체 클래스는 Comparable 인터페이스를 구현한 상태이어야 한다.
class Friend implements Comparable { // Comarable 인터페이스를 구현
private String name;
private int age;
public Friend(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Object o) {
Friend p = (Friend)o;
return this.age - p.age; // 나이가 같으면 0을 반환
}
@Override
public String toString() {
return name + " : " + age;
}
}
class ArraysClassSearch_Object {
public static void main(String[] args) {
Friend[] ar = new Friend[4];
ar[0] = new Friend("wuga", 26);
ar[1] = new Friend("june", 27);
ar[2] = new Friend("hyeon", 25);
ar[3] = new Friend("anne", 26);
Arrays.sort(ar); // 탐색에 앞서 정렬을 진행
int idx = Arrays.binarySearch(ar, new Friend("who are you?", 27)); // 나이가 27인 객체 탐색
System.out.println(ar[idx]);
}
}
// 실행 결과
june : 27
Reference
http://www.tcpschool.com/java/java_api_arrays
'☕ Java > 이론' 카테고리의 다른 글
[Java] Map 컬렉션 클래스 (0) | 2022.01.25 |
---|---|
[Java] 컬렉션 프레임워크 (0) | 2022.01.18 |
[Java] 제네릭3 (와일드 카드) (0) | 2022.01.17 |
[Java] 제네릭2 (상속, 제네릭 인터페이스) (0) | 2022.01.14 |
[Java] 제네릭1 (제네릭 클래스, 제네릭 메소드) (0) | 2022.01.13 |
[Java] 기본 클래스 (Math, Random, StringTokenizer) (0) | 2022.01.12 |
[Java] BigInteger, BigDecimal 클래스 (0) | 2022.01.11 |
[Java] Wrapper, Number 클래스 (0) | 2022.01.11 |