Language/Java

[Java] 자바 API 클래스 - Calendar 클래스

재은초 2024. 4. 13. 22:51
반응형

java.util 패키지

  • java.util 패키지에는 프로그램을 개발하는 데 사용할 수 있는 유용한 유틸리티 클래스가 다수 포함되어 있다.
  • java.lang 패키지 다음으로 가장 많이 사용되는 패키지가 java.util 패키지다. 하지만 import 문을 사용하지 않아도 바로 사용할 수 있는 java.lang 패키지와는 달리 java.util 패키지는 import 문으로 패키지를 불러오고 나서야 클래스 이름만으로 사용할 수 있다.

 

java.util.Calendar 클래스

  • Calendar 클래스는 자바에서 날짜와 시간에 관한 데이터를 손쉽게 처리할 수 있도록 제공하는 추상 클래스다. Calendar 클래스가 추상 클래스로 선언된 이유는 나라마다 사용하는 달력 체계가 조금씩 다를 수 있기 때문이다.
  • Calendar 클래스의 모든 필드는 클래스 변수(static variable)이므로, 객체를 생성하지 않고도 바로 사용할 수 있다.

java.util.GregorianCalendar 클래스

  • 현재 전 세계적으로 가장 많이 사용되는 달력은 1582년 교황 그레고리오 13세가 개혁한 그레고리오 달력이다.
  • Calendar 클래스는 추상 클래스이므로, 직접 인스턴스를 생성할 수 없다. 그래서 GregorianCalendar 클래스는 이러한 Calendar 클래스를 상속받아 그레고리오 달력을 완전히 구현한 하위 클래스다.

자바에서의 날짜 및 시간 처리

  • JDK 1.0에서는 Date 클래스를 사용하여 날짜에 관한 간단한 처리만을 수행할 수 있지만, Date 클래스는 현재 대부분의 메소드가 사용을 권장하지 않고(deprecated) 있다.
  • JDK 1.1부터는 새롭게 제공되는 Calendar 클래스를 이용하여 날짜와 시간에 관한 처리를 수행하게 됩지만 이러한 Calendar 클래스는 다음과 같은 문제점이 있다.
    • Calendar 인스턴스는 불변 객체(immutable object)가 아니라서 값이 수정될 수 있다.
    • 윤초(leap second)와 같은 특별한 상황을 고려하지 않는다.
    • Calendar 클래스에서는 월(month)을 나타낼 때 1월부터 12월을 0부터 11까지로 표현해야 하는 불편함이 있다.
  • Java SE 8 버전에서는 이러한 Joda-Time 라이브러리를 발전시킨 새로운 날짜와 시간 API인 java.time 패키지를 제공한다. java.time 패키지는 위와 같은 문제점을 모두 해결했으며, 다양한 기능을 지원하는 다수의 하위 패키지를 포함하고 있다.

add() 메소드

  • add() 메소드는 전달된 Calendar 필드에서 일정 시간 만큼을 더하거나 빼준다.
Calendar time = Calendar.getInstance();
System.out.println(time.getTime());

time.add(Calendar.SECOND, 120);
System.out.println(time.getTime());

>> Sat Apr 13 13:19:03 GMT 2024
>> Sat Apr 13 13:21:03 GMT 2024

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(2020, 2, 19);
 
System.out.println(time1.before(time2));
System.out.println(time1.before(time3));

>> false
>> true

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

>> Sat Apr 13 13:38:50 GMT 2024
>> 7
>> 4
>> 13
>> 13
>> 38
>> 50
>> 2024

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

>> Sat Apr 13 13:40:05 GMT 2024
>> Sat Apr 13 13:41:05 GMT 2024
>> Sat Apr 13 13:40:05 GMT 2024

set() 메소드

  • set() 메소드는 전달된 Calendar 필드를 특정 값으로 설정한다.
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());

>> Sat Apr 13 13:49:24 GMT 2024
>> Mon Apr 13 13:49:24 GMT 2020
>> Fri Feb 19 13:49:24 GMT 1982
>> Fri Feb 19 12:34:56 GMT 1982

Calendar 메소드들

 

Reference

반응형