13. 자바 API 클래스(Java API Class) - 2
1. 키워드
java.util
패키지
Arrays
클래스
Calendar
클래스
2. Arrays
클래스
1) java.util
패키지
java.util
패키지에는 프로그램을 개발하는 데 사용할 수 있는 유용한 유틸리티 클래스가 다수 포함되어 있다.
- 실제로
java.lang
패키지 다음으로 가장 많이 사용되는 패키지가 java.util
패키지이다.
- 하지만
java.util
패키지는 import
문으로 패키지를 불러오고 나서야 클래스 이름만으로 사용할 수 있다.
2) java.util.Arrays
클래스
Arrays
클래스에는 배열을 다루기 위한 다양한 메서드가 포함되어 있다.
Arrays
클래스의 모든 메서드는 클래스 메서드(Static Method)이므로, 객체를 생성하지 않고도 바로 사용할 수 있다.
- 이 클래스는
java.util
패키지에 포함되므로, 반드시 import
문으로 java.util
패키지를 불러오고 나서 사용해야 한다.
3) binarySearch()
메서드
binarySearch()
메서드는 전달받은 배열에서 특정 객체의 위치를 이진 탐색 알고리즘을 사용하여 검색한 후, 해당 위치를 반환한다.
- 이 메서드는 이진 탐색 알고리즘을 사용하므로, 매개변수로 전달되는 배열이
sort()
메서드 등을 사용하여 미리 정렬되어 있어야만 제대로 동작한다.
int[] arr = new int[1000];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
System.out.println(Arrays.binarySearch(arr, 437));
// 437
4) copyOf()
메서드
copyOf()
메서드는 전달받은 배열의 특정 길이만큼을 새로운 배열로 복사하여 반환한다.
copyOf()
메서드는 첫 번째 매개변수로 원본 배열을 전달받고, 두 번째 매개변수로 원본 배열에서 새로운 배열로 복사할 요소의 개수를 전달받는다.
- 그리고 원본 배열과 같은 타입의 복사된 새로운 배열을 반환한다.
- 이때 새로운 배열의 길이가 원본 배열보다 길면, 나머지 요소는 배열 요소의 타입에 맞게 다음과 같은 기본값으로 채워진다.
배열 요소의 타입 |
기본값 |
char |
'\u0000' |
byte , short , int |
0 |
long |
0L |
float |
0.0F |
double |
0.0 또는 0.0D |
boolean |
false |
배열, 인스턴스 |
null |
int[] arr1 = { 1, 2, 3, 4, 5 };
① int[] arr2 = Arrays.copyOf(arr1, 3);
for (int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i] + " ");
}
System.out.println();
② int[] arr3 = Arrays.copyOf(arr1, 10);
for (int i = 0; i < arr3.length; i++) {
System.out.print(arr3[i] + " ");
}
System.out.println();
③ int[] arr4 = Arrays.copyOf(arr1, arr1.length);
for (int i = 0; i < arr4.length; i++) {
System.out.print(arr4[i] + " ");
}
// 1 2 3
// 1 2 3 4 5 0 0 0 0 0
// 1 2 3 4 5
- 위 예제의 ①번 라인에서는
copyOf()
메서드를 사용하여 배열 arr1
의 첫 번째 배열 요소부터 3
개의 요소를 복사하여 배열 arr2
에 대입하고 있다.
- ②번 라인에서는 배열
arr1
에서 10
개의 배열 요소를 복사하여 배열 arr3
에 대입하려고 한다.
- 하지만 배열
arr1
의 길이가 5
밖에 안 되므로, 배열 arr3
의 나머지 배열 요소에는 int
형 기본값이 0
이 채워지게 된다.
- 배열
arr1
의 모든 요소를 온전히 복사하고 싶으면, ③번 라인처럼 배열 arr1
의 길이를 copyOf()
메서드의 두 번째 인수로 전달하면 된다.
5) copyOfRange()
메서드
copyOfRange()
메서드는 전달받은 배열의 특정 범위에 해당하는 요소만을 새로운 배열로 복사하여 반환한다.
copyOfRange()
메서드는 첫 번째 매개변수로 복사의 대상이 될 원본 배열을 전달받는다.
- 두 번째 매개변수로는 원본 배열에서 복사할 시작 인덱스를 전달받고, 세 번째 매개변수로는 마지막으로 복사될 배열 요소의 바로 다음 인덱스를 전달받는다.
- 즉, 세 번째 매개변수로 전달된 인덱스 바로 전까지의 배열 요소까지만 복사된다.
- 그리고 원본 배열과 같은 타입의 복사된 새로운 배열을 반환한다.
int[] arr1 = { 1, 2, 3, 4, 5 };
int[] arr2 = Arrays.copyOfRange(arr1, 2, 4);
for (int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i] + " ");
}
// 3 4
6) fill()
메서드
fill()
메서드는 전달받은 배열의 모든 요소를 특정 값으로 초기화해 준다.
fill()
메서드는 첫 번째 매개변수로 초기화할 배열을 전달받고, 두 번째 매개변수로 초깃값을 전달받는다.
- 따라서 이 메서드는 전달받은 원본 배열의 값을 변경하게 된다.
int[] arr = new int[10];
Arrays.fill(arr, 7);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
// 7 7 7 7 7 7 7 7 7 7
7) sort()
메서드
sort()
메서드는 전달받은 배열의 모든 요소를 오름차순으로 정렬한다.
sort()
메서드는 매개변수로 정렬할 배열을 전달받으며, 따라서 이 메서드는 전달받은 원본 배열의 순서를 변경하게 된다.
int[] arr = { 5, 3, 4, 1, 2 };
Arrays.sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
// 1 2 3 4 5
3. Calendar
클래스
1) java.util.Calendar
클래스
Calendar
클래스는 자바에서 날짜와 시간에 관한 데이터를 손쉽게 처리할 수 있도록 제공하는 추상 클래스이다.
- 이 클래스가 추상 클래스로 선언된 이유는 나라마다 사용하는 달력 체계가 조금씩 다를 수 있기 때문이다.
- 이러한
Calendar
클래스에는 날짜와 시간을 처리하기 위한 다양한 필드와 메서드가 포함되어 있다.
Calendar
클래스의 모든 필드는 클래스 변수(Static Variable)이므로, 객체를 생성하지 않고도 바로 사용할 수 있다.
2) java.util.GregorianCalendar
클래스
- 현재 전 세계적으로 가장 많이 사용되는 달력은 1582년 교황 그레고리오 13세가 개혁한 그레고리오 달력이다.
Calendar
클래스는 추상 클래스이므로, 직접 인스턴스를 생성할 수 없다.
GregorianCalendar
클래스는 이러한 Calendar
클래스를 상속받아 그레고리오 달력을 완전히 구현한 하위 클래스이다.
3) add()
메서드
add()
메서드는 전달된 Calendar
필드에서 일정 시간만큼을 더하거나 빼준다.
- 즉, 특정 시간을 기준으로 일정 시간 전후의 날짜와 시간을 알 수 있다.
- 다음 예제는
add()
메서드를 이용하여 현재 시각에 120
초를 더하는 예제이다.
Calendar time = Calendar.getInstance();
System.out.println(time.getTime());
time.add(Calendar.SECOND, 120);
System.out.println(time.getTime());
// Tue Jun 15 18:18:44 KST 2021
// Tue Jun 15 18:20:44 KST 2021
4) before()
메서드와 after()
메서드
- 두 시간상의 전후 관계만을 알고 싶을 경우에는
before()
메서드와 after()
메서드를 사용할 수 있다.
before()
메서드는 현재 Calendar
인스턴스가 전달된 객체가 나타내는 시간보다 앞서는지를 판단한다.
- 반대로
after()
메서드는 현재 Calendar
인스턴스가 전달된 객체가 나타내는 시간보다 나중인지를 판단한다.
Calendar time1 = Calendar.getInstance();
Calendar time2 = Calendar.getInstance();
Calendar time3 = Calendar.getInstance();
time2.set(1982, 2, 19);
time3.set(2030, 2, 19);
System.out.println(time1.getTime());
System.out.println(time1.after(time2));
System.out.println(time1.before(time3));
// Tue Jun 15 18:25:10 KST 2021
// true
// true
5) get()
메서드
get()
메서드는 전달된 Calendar
필드에 저장된 값을 반환한다.
Calendar time = Calendar.getInstance();
System.out.println(time.getTime());
System.out.println(time.get(Calendar.DAY_OF_WEEK));
System.out.println(time.get(Calendar.MONTH) + 1);
System.out.println(time.get(Calendar.DAY_OF_MONTH));
System.out.println(time.get(Calendar.HOUR_OF_DAY));
System.out.println(time.get(Calendar.MINUTE));
System.out.println(time.get(Calendar.SECOND));
System.out.println(time.get(Calendar.YEAR));
// Tue Jun 15 18:26:47 KST 2021
// 3
// 6
// 15
// 18
// 26
// 47
// 2021
6) roll()
메서드
roll()
메서드는 전달된 Calendar
필드에서 일정 시간만큼을 더하거나 빼준다.
- 하지만
add()
메서드와는 달리 다른 Calendar
필드에는 영향을 주지 않는다.
- 즉, 계산 결과가 해당 필드의 최댓값이나 최솟값을 넘어가도 다른 필드에 영향을 주지 않는다.
Calendar time1 = Calendar.getInstance();
Calendar time2 = Calendar.getInstance();
System.out.println(time1.getTime());
time1.add(Calendar.SECOND, 60);
System.out.println(time1.getTime());
time2.roll(Calendar.SECOND, 60);
System.out.println(time2.getTime());
// Tue Jun 15 18:28:57 KST 2021
// Tue Jun 15 18:29:57 KST 2021
// Tue Jun 15 18:28:57 KST 2021
- 위의 예제에서
add()
메서드를 사용하여 Calendar.SECOND
필드를 60
초 증가시키면 결과적으로 Calendar.MINUTE
필드가 1
증가해야 한다.
- 하지만
roll()
메서드를 사용하여 Calendar.SECOND
필드를 60
초 증가시키면 Calendar.MINUTE
필드에는 아무런 영향을 주지 않는다.
- 즉,
Calendar.SECOND
필드만이 60
초 증가하여 결과적으로 같은 값이 출력된다.
7) set()
메서드
set()
메서드는 전달된 Calendar
필드를 특정 값으로 설정한다.
- 다음 예제는
set()
메서드에 다양한 형태의 인수를 전달하여 시간을 설정하는 예제이다.
Calendar time = Calendar.getInstance();
System.out.println(time.getTime());
time.set(Calendar.YEAR, 2020);
System.out.println(time.getTime());
time.set(1982, 1, 19); // 1은 2월을 나타냄.
System.out.println(time.getTime());
time.set(1982, 1, 19, 12, 34, 56);
System.out.println(time.getTime());
// Tue Jun 15 18:32:02 KST 2021
// Mon Jun 15 18:32:02 KST 2020
// Fri Feb 19 18:32:02 KST 1982
// Fri Feb 19 12:34:56 KST 1982
References