Skip to content

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