[JAVA] Calendar 클래스 (달력 출력)

2019. 10. 1. 13:47 JAVA/Java

Calendar 클래스 (달력 출력)



Calendar 클래스도 Date 클래스처럼 날짜와 시간에 관한 정보를 표현할 때 사용한다. Date 클래스에서 deprecate된 메소드나 생성자들 중 같은 기능의 메소드가 Calendar 클래스에서 제공된다.


Calendar 클래스는 추상 클래스이므로 객체를 직접 생성할 수는 없지만, getInstance() 메소드를 이용하여 시스템의 날짜와 시간 정보를 표현할 수 있다.


* Calendar 클래스의 주요 상수


상수

사용방법

설명 

static int YEAR

Calendar.YEAR 

 현재 년도를 가져온다.

static int MONTH 

Calendar.MONTH 

 현재 월을 가져온다. (1월은 0) 

static int DATE 

Calendar.DATE 

 현재 월의 날짜를 가져온다. 

static int WEEK_OF_YEAR 

Calendar.WEEK_OF_YEAR

 현재 년도의 몇째 주

static int WEEK_OF_MONTH 

Calendar.WEEK_OF_MONTH 

 현재 월의 몇째 주 

static int DAY_OF_YEAR 

Calendar.DAY_OF_YEAR 

 현재 년도의 날짜 

static int DAY_OF_MONTH

Calendar.DAY_OF_MONTH 

 현재 월의 날짜 (DATE와 동일) 

static int DAY_OF_WEEK 

Calendar.DAY_OF_WEEK 

 현재 요일 (일요일은 1, 토요일은 7)

static int HOUR 

Calendar.HOUR 

 현재 시간 (12시간제)

static int HOUR_OF_DAY

Calendar.HOUR_OF_DAY 

 현재 시간 (24시간제) 

static int MINUTE 

Calendar.MINUTE 

 현재 분

static int SECOND 

Calendar.SECOND 

 현재 초 


- Calendar 클래스의 상수는 이 외에도 많이 있다.



* Calendar 클래스 메소드


Calendar 클래스의 메소드 

설명 

boolean after(Object when) 

when과 비교하여 현재 날짜 이후이면 true, 아니면 false를 반환한다. 

boolean before(Object when)

when과 비교하여 현재 날짜 이전이면 true, 아니면 false를 반환한다.

boolean equals(Object obj) 

같은 날짜값인지 비교하여 true, false를 반환한다. 

int get(int field) 

현재 객체의 주어진 값의 필드에 해당하는 상수 값을 반환한다.

이 상수값은 Calendar 클래스의 상수중에 가진다. 

static Calendar getInstance()

현재 날짜와 시간 정보를 가진 Calendar 객체를 생성한다. 

Date getTime()

현재의 객체를 Date 객체로 변환한다. 

long getTimeInMills() 

객체의 시간을 1/1000초 단위로 변경하여 반환한다. 

void set(int field, int value) 

현재 객체의 특정 필드를 다른 값으로 설정한다. 

void set(int year, int month, int date) 

현재 객체의 년, 월, 일 값을 다른 값으로 설정한다. 

void set(int year, int month, int date, int hour, int minute, int second) 

현재 객체의 년, 월, 일, 시, 분, 초 값을 다른 값으로 설정한다. 

void setTime(Date date) 

date 객체의 날짜와 시간 정보를 현재 객체로 생성한다. 

void setTimeInMills(long mills) 

현재 객체를 1/1000초 단위의 주어진 매개변수 시간으로 설정한다. 

int getActualMinimum(int field)

현재 객체의 특정 필드의 최소 값을 반환한다.

int getActualMaximum(int field)

현재 객체의 특정 필드의 최대 값을 반환한다. 



Calendar 클래스는 추상 클래스로 생성자를 제공하지 않는다. 따라서, Calendar 클래스의 객체를 생성하기 위해 new 연산자를 사용할 수 없다.  그 대신 getInstance() 메소드를 사용하여 현재 날짜와 시간의 객체를 얻어올 수 있다.


* Calendar 예제


import java.util.Calendar;

public class CalendarTest {

    public static void main(String[] args) {
       
        Calendar cal = Calendar.getInstance();
       
        int year = cal.get(Calendar.YEAR);
        int mon = cal.get(Calendar.MONTH);
        int day = cal.get(Calendar.DAY_OF_MONTH);
        int hour = cal.get(Calendar.HOUR_OF_DAY);
        int min = cal.get(Calendar.MINUTE);
        int sec = cal.get(Calendar.SECOND);
       
        System.out.println("현재시간");
        System.out.println(year + "년 "+ mon+"월 "+day+"일");
        System.out.println(hour + "시 "+ min+"분 "+sec+"초");   
    }

}





* Calendar 를 이용한 달력 출력 소스


 

import java.util.Calendar;

public class CalendarPrint {
   
    // Calendar 인스턴스 생성
    Calendar cal = Calendar.getInstance();
   
    // 요일 표시 헤더
    private String[] calHeader = {"일","월","화","수","목","금","토"};
    // 날짜 데이터 배열
    private String[][] calDate = new String[6][7];

    private int width=calHeader.length; // 배열 가로 넓이
    private int startDay;   // 월 시작 요일
    private int lastDay;    // 월 마지막 날짜
    private int inputDate=1// 입력 날짜

    // 생성자 : 데이터 생성
    public CalendarPrint(int year, int month) throws Exception{
       
        // 입력 month(월) 은 1~12 사이의 값이다.
        if(month<1 || month>12){
            System.out.println("월은 1~12 사이의 숫자입니다.");
            throw new Exception();
        }else{
           
            // Calendar에 년,월,일 셋팅
            cal.set(Calendar.YEAR, year);
            cal.set(Calendar.MONTH, month-1);
            cal.set(Calendar.DATE, 1);
           
            startDay = cal.get(Calendar.DAY_OF_WEEK); // 월 시작 요일
            lastDay = cal.getActualMaximum(Calendar.DATE); // 월 마지막 날짜
           
            // 2차 배열에 날짜 입력
            int row = 0;
            for(int i=1; inputDate<=lastDay; i++){
               
                // 시작 요일이 오기전에는 공백 대입
                if(i<startDay) calDate[row][i-1]="";
                else{
                    // 날짜 배열에 입력
                    calDate[row][(i-1)%width]=Integer.toString(inputDate);
                    inputDate++;
                   
                    // 가로 마지막 열에 오면 행 바꿈
                    if(i%width==0) row++;
                }      
            }
        }
    }

    // 달력 출력
    public void printCal(){
       
        // 달력 헤더 출력 "일월화수목금토"
        for(int i=0; i<width; i++){
            System.out.print(calHeader[i]+" ");
        }
        System.out.println();
       
        // 날짜 배열 출력
        int row=0;
        for(int j=1 ; j<lastDay+startDay; j++){
           
            System.out.print(calDate[row][(j-1)%width]+" ");
           
            if((j-1)%width==width-1){
                System.out.println();
                row++;
            }
           
        }
    }

    ......

    getter(), setter()
    
    ......
}

 

import java.util.Scanner;


public class mainTest {

    public static void main(String[] args) {
       
        int year;
        int month;
       
        Scanner sc = new Scanner(System.in);
        System.out.println("년도를 입력하세요 : ");
        year=sc.nextInt();
        System.out.println("월을 입력하세요 : ");
        month=sc.nextInt();
       
        try{
            // 입력받은 year와 month를 매개변수로 객체 및 데이터 생성
            CalendarPrint cal = new CalendarPrint(year, month);
            // System.out 콘솔에 출력
            cal.printCal();
           
        }catch(Exception e){
            e.printStackTrace();
        }
       
    }
}




- 위 달력 출력 프로그램은 CalendarPrint 객체를 생성하면서, year와 month 를 입력받는다.

- 입력받은 year와 month로 이차 배열에 해당 년/월 의 날짜를 입력한다.

- printCal() 메소드를 호출하면 System.out 콘솔에 달력을 출력할 수 있다.

- 해당 데이터를 별도로 사용하려면, getCalHeader()와 getCalDate()로 배열 형태로 데이터를 가져올 수 있다.


CalendarTest.zip


JAVA API DOC : java.util.Calendar



출처: https://hyeonstorage.tistory.com/205?category=557602 [개발이 하고 싶어요]