본문 바로가기
Study Note/Java

JAVA_ Test138_ Calendar 클래스 / GregorianCalender()는 Calendar의 자식객체

by 시뮝 2018. 6. 16.
728x90


Test138  Calendar 클래스 / GregorianCalender()는 Calendar의 자식객체

※ java.util.Calendar 클래스는

   날짜와 시간을 객체 모델링화 한 클래스로 연, 월, 일, 요일, 시, 분, 초 까지의 시간과 날짜가 관련된 정보를 제공한다.

   그리고, Calendar 클래스는 추상클래스이므로 직접 객체를 생성할 수 없으며 실제적인 메소드 구현은 Calendar 클래스의 서브 클래스인

   『GregorianCalendar』 클래스에 정의되어 있다.


   시스템으로부터 현재 시스템 시간 정보를 얻어올 때 getInstance() 라는 정적(static) 메소드를 이용하여 객체를 생성할 수 있다.

   생성된 Calendar 클래스 객체는 시스템의 현재 날짜와 시간 정보를 가지며, 이 객체가 생성되면 갖고  있는 시간 정보들은

   get() 메소드를 이용하여 쉽게 가져올(사용할) 수 있다.


   getInstance() 메소드는 내부적으로 GregorianCalendar 객체를 생성하여 돌려주기 때문에

   GregorianCalendar 객체를 직접 생성하여 시간 정보를 구할 수도 있다.


※ 실습 문제

   사용자로부터 연, 월 을 입력받아 달력을 그려주는(출력하는) 프로그램을 구현한다.

   단, Calendar 클래스를 활용하여 작성할 수 있도록 한다.


Test138.java

import java.util.Scanner;

import java.util.Calendar;

import java.util.GregorianCalendar;


public class Test138

{

public static void main(String[] args)

{

// Scanner 인스턴스 생성

Scanner sc = new Scanner(System.in);

// Calendar 인스턴스 생성

Calendar ob = new GregorianCalendar();

//-- GregorianCalendar()는 Calendar의 자식클래스임을 짐작할 수 있으며,

//   업캐스팅한 것이다.


// 주요 변수 선언

int y, m; //-- 사용자로부터 입력받은 년, 월을 담을 변수


// 연, 월 입력받기

do

{

System.out.print("연도 입력 : ");

y = sc.nextInt();

}

while (y<0);    //-- 음수형 정수를 입력할 경우 양수형 정수를 받을 때 까지 반복한다.


do

{

System.out.print("월 입력 : ");

m = sc.nextInt();

}

while (m<0 || m>12);    //-- 1~12월 사이로만 입력받도록 반복한다.


// 날짜 셋팅하기

ob.set(y, m-1, 1);

int dayOfWeek = ob.get(Calendar.DAY_OF_WEEK); //-- 요일 시작점을 받아와 변수 dayOfWeek에 담는다.

int monthDays = ob.getActualMaximum(Calendar.DATE); //-- 해당 월의 마지막 일을 받아와 변수 monthDays에 담는다.



// 결과 출력

System.out.printf("    [ %d년 %d월 ]\n", y, m);    //-- 입력된 연, 월

System.out.println(" 일 월 화 수 목 금 토");

System.out.println("=====================");

//-- 해당 날짜의 첫 시작점(요일)이 dayOfWeek 이므로, 『i=1』로 시작해주고 시작점 전까지 공백처리시켜준다.

for (int i=1; i<dayOfWeek; i++)

System.out.print("   "); // 아래 숫자 영역이 %3d 이므로 공백또한 3칸으로 처리해준다.



/*----------------------------------------------------------------[내가 한거]

//-- 해당 월의 1일 부터 마지막 날짜까지 숫자를 기입한다.

for (int j=1; j<=monthDays; j++) 

{

System.out.printf("%3d", j);


                        //-- 7로 나누어 떨어지면 개행을 하되 마지막 일수가 있는 날은 바로 개행을 시켜버린다.

if (((j+dayOfWeek-1)%7==0) || (j == monthDays))   

System.out.println();

}

----------------------------------------------------------------*/

int w = dayOfWeek;

// Calendar 클래스의 『getActualMaximum()』 메소드 check~!!

for (int i=1; i<ob.getActualMaximum(Calendar.DATE); i++)

{

System.out.printf("%3d", i);

w++;

if (w%7==0)

{

System.out.println(); // 개행

}

}

if (w%7!=1)

System.out.println();


System.out.println("=====================");

}

}


cmd

연도 입력 : 2018

월 입력 : 5

    [ 2018년 5월 ]

 일 월 화 수 목 금 토

=====================

        1  2  3  4

  5  6  7  8  9 10 11

 12 13 14 15 16 17 18

 19 20 21 22 23 24 25

 26 27 28 29 30

=====================

계속하려면 아무 키나 누르십시오 . . .







728x90

댓글