Array클래스는 배열 조각 기능을 가지고 있다.
배열 조작이란 배열의 복사, 항목 정렬, 항목 검색과 같은 기능을 말한다.
단순한 배열 복사는 System.arraycopy() 메소드를 사용할 수 있으나, Arrays는 추가적으로 항목, 정렬, 항목 검색, 항목 비교와 같은 기능을 제공한다.
Arrays 클래스는 모든 메소드는 정적(static)이므로 Arrays클래스를 바로 쓸 수 있다.
배열 복사
배열 복사를 위해 사용할 수 있는 메소드는 copyOf(원본배열, 복사할 길이), copyOfRange(원본배열, 시작인덱스, 끝인덱스) 이다.
복사할 길이는 원본 길이보다 커도 되며, 타겟 배열의 길이가 된다.
copyOfRange(원본 배열, 시작인덱스, 끝인덱스)는 원본 배열의 시작 인덱스에서 끝 인덱스까지 복사한 배열을 리턴한다.
단순 배열의 복사할 목적이라면 System.arraycopy() 메소드를 사용할 수 있다.
System.arraycopy( 원본 배열, 원본 시작인덱스, 타겟배열, 타겟시작인덱스, 복사개수) 로 사용한다.
import java.util.Arrays;
public class ArrayMain {
public static void main(String[] args) {
char[] arr1 = { 'J', 'A', 'V', 'A'};
char[] arr2 = Arrays.copyOf(arr1, arr1.length);
System.out.println(Arrays.toString(arr2));
char[] arr3 = Arrays.copyOfRange(arr1, 1, 3);
System.out.println(Arrays.toString(arr3));
char[] arr4 = new char[arr1.length];
System.arraycopy(arr1, 0, arr4, 0, arr1.length);
for(char a : arr4) {
System.out.print(a);
}
}
}
배열 항목 비교
Arrays의 equals() 와 deepEquals()는 배열 항목을 비교한다.
equlas() 는 1차 항목의 값만 비교하고, deepEquals()는 1차 항목이 서로 다른 배열을 참조할 경우 중첩된 배열의 항목까지 비교한다.
import java.util.Arrays;
public class EqualsMain {
public static void main(String[] args) {
int[][] original = { {1,2}, {3,4} };
System.out.println("[얕은 복제후 비교]");
int[][] clone1 = Arrays.copyOf(original, original.length);
System.out.println("배열 번지 비교: " + original.equals(clone1));
System.out.println("1차 배열 항목값 비교: " + Arrays.equals(original, clone1));
System.out.println("중첩 배열 항목값 비교: " + Arrays.deepEquals(original, clone1));
System.out.println("[깊은 복제후 비교]");
int[][] clone2 = Arrays.copyOf(original, original.length);
clone2[0] = Arrays.copyOf(original[0], original[0].length);
clone2[1] = Arrays.copyOf(original[1], original[1].length);
System.out.println("배열 번지 비교: " + original.equals(clone2));
System.out.println("1차 배열 항목값 비교: " + Arrays.equals(original, clone2));
System.out.println("중첩 배열 항목값 비교: " + Arrays.deepEquals(original, clone2));
}
}
배열 항목 정렬
기본 타입 또는 String 배열은 Arrays.sort()메소드의 매개값으로 지정해주면 자동으로 오름차순정렬이 된다.
사용자 정의 클래스 타입일 경우에는 클래스가 Comparable인터페이스를 구현하고 있어야 정렬이 된다.
compareTo() 메소드의 리턴값은 오름차순일 때 자신이 매개값보다 낮을 경우 음수, 같을 경우 0, 높을 경우 양수를 리턴한다.
반대로 내림차순일때 자신이 매개값보다 낮을 경우 양수, 같을 경우 0, 높을 경우 음수를 리턴한다.
import java.util.Arrays;
public class SortMain {
public static void main(String[] args) {
int[] scores = { 99, 97, 98 };
Arrays.sort(scores);
for(int i : scores) {
System.out.print(i + ",");
}
System.out.println();
String names[] = { "홍길동", "박동수", "김동수" };
Arrays.sort(names);
for(String a : names) {
System.out.print(a + ", ");
}
System.out.println();
Name n1 = new Name("홍길동");
Name n2 = new Name("박동수");
Name n3 = new Name("김동수");
Name[] Names = { n1, n2, n3 };
Arrays.sort(Names);
for(Name n : Names) {
System.out.print(n.name + ", ");
}
}
}
class Name implements Comparable<Name> {
String name;
Name(String name) {
this.name = name;
}
@Override
public int compareTo(Name o) {
return name.compareTo(o.name);
}
}
배열 항목 검색
배열 항목에서 특정 값이 위치한 인덱스를 얻는 것을 배열 검색이라고 한다.
배열 항목을 검색하려면 Arrays.sort() 메소드로 항목들을 오름차순으로 정렬한후 찾아야 한다.
import java.util.Arrays;
public class SearchMain {
public static void main(String[] args) {
int[] scores = { 99, 97, 98 };
Arrays.sort(scores);
int index = Arrays.binarySearch(scores, 99);
System.out.println("찾은 인덱스 : " + index);
System.out.println();
String names[] = { "홍길동", "박동수", "김동수" };
Arrays.sort(names);
index = Arrays.binarySearch(names, "홍길동");
System.out.println("찾은 인덱스 : " + index);
System.out.println();
Name n1 = new Name("홍길동");
Name n2 = new Name("박동수");
Name n3 = new Name("김동수");
Name[] Names = { n1, n2, n3 };
Arrays.sort(Names);
index = Arrays.binarySearch(Names, n1);
System.out.println("찾은 인덱스: " + index);
}
}
class Name implements Comparable<Name> {
String name;
Name(String name) {
this.name = name;
}
@Override
public int compareTo(Name o) {
return name.compareTo(o.name);
}
}
Wrapper(포장) 클래스
기본타입(byte, char, short, int, long, float, double, boolean) 의 값을 갖는 객체를 생성할 수 있다.
이런 객체를 포장(Wrapper) 객체라고 한다.
char 타입과 int 타입은 각각 Character와 Integer로 변경되고, 기본타입의 첫 문자를 대문자로 바꾼 이름을 가지고 있다.
기본타입 | 포장 클래스 |
byte | Byte |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
박싱(Boxing) 과 언박싱(Unboxing)
기본 타입의 값을 포장 객체로 만드는 과정을 박싱(Boxing)이라고 하고, 반대로 기본값을 얻어내는 과정을 언박싱(Unboxing)이라고 한다.
public class BoxingUnBoxingMain {
public static void main(String[] args) {
Integer obj1 = new Integer(100);
Integer obj2 = new Integer("200");
Integer obj3 = Integer.valueOf("300");
int value1 = obj1.intValue();
int value2 = obj2.intValue();
int value3 = obj3.intValue();
System.out.println(value1);
System.out.println(value2);
System.out.println(value3);
}
}
자동 박싱과 언박싱
기본 타입 값을 직접 박싱, 언박싱하지 않아도 자동적으로 박싱과 언박싱이 일어나는 경우가 있다.
자동 박싱은 포장 클래스 타입에 기본값이 대입될 경우에 발생한다.
Integer obj = 100;
자동 언박싱은 기본 타입에 포장 객체가 대입될 경우에 발생된다.
Integer obj = new Integer(200);
int value1 = obj;
public class AutoBoxingMain {
public static void main(String[] args) {
Integer obj = 100;
System.out.println("value: " + obj.intValue());
int value = obj;
System.out.println("value: " + value);
int result = obj + 100;
System.out.println("result: " + result);
}
}
포장 객체는 내부의 값을 비교하기 위해 == 와 != 연산자를 사용할 수 없다.
'프로그래밍 > 자바(java)' 카테고리의 다른 글
[자바/java] 멀티 스레드 (0) | 2020.04.26 |
---|---|
[자바/java] Math클래스, Date 클래스 (0) | 2020.04.21 |
[자바/java] String 클래스, String 메소드 (0) | 2020.04.17 |
[자바/java] System 클래스, Class 클래스 (0) | 2020.04.15 |
[자바/java] Object 클래스, Objects 클래스 (0) | 2020.04.13 |