[JAVA]19일차(Calendar 클래스/달력만들기)

정효진·2021년 8월 10일
0

Developer Study

목록 보기
31/47
post-thumbnail

8월10일(화)

◼ Calendar 클래스

▪ Calendar 클래스는 추상클래스이기 때문에 객체를 생성할 수 없다.

(추상 클래스 : 미완성된 클래스)

Calendar ob = new Calendar();

→ 이와 같은 구문을 통해 인스턴스 생성 불가!

▪ Calendar 객체(인스턴스)를 생성할 수 있는 방법

  1. Calendar ob1 = Calendar.getInstance();
    → .getInstance()는 정적 메소드이다 정적메소드는 static 메소드

  2. Calendar ob2 = new GregorianCalendar();
    →그래고리언은 캘린더의 자식 클래스겠구나~~ (업캐스팅)

  3. GregorianCalendar ob3 = new GregorianCalendar();
    (※ GregorianCalendar : Calendar 클래스의 하위 클래스)

*/

▪현재의 년, 월, 일, 요일을 Calendar 객체를 활용하여 출력 코드📝

import java.util.Calendar;
import java.util.GregorianCalendar;

public class Test138
{
	public static void main(String[] args)
	{
		// Calendar 클래스 기반 인스턴스 생성  
		//Calendar rightNow = new Calendar();
		Calendar rightNow = Calendar.getInstance();    //--1번 방법

		// 생성된 달력(Calendar) 인스턴스를 통해
		// 날짜 관련 정보를 얻어낼 수 있는 메소드 → 『get()』
		int y = rightNow.get(Calendar.YEAR);   // static final(상수 변수)
		System.out.println(y);
		//--==>> 2021

		int m = rightNow.get(Calendar.MONTH) + 1;  //배열의 인덱스 구조를 갖고 있기 때문에 
		System.out.println(m);						// ★『+1』★ 해야해~!!               //--check~!!!
		//--==>> 8

		int d = rightNow.get(Calendar.DATE);
		System.out.println(d);
		//--==>> 10

		int w = rightNow.get(Calendar.DAY_OF_WEEK);
		System.out.println(w);
		//--==>> 3

		System.out.println(y + "-" + m + "-" + d + " " + w);
		//--==>> 2021-8-10 3

		//테스트
		System.out.println(Calendar.SUNDAY);     //--==>>1 -> 일요일
		System.out.println(Calendar.MONDAY);     //--==>>2 -> 월요일
		System.out.println(Calendar.TUESDAY);    //--==>>3 -> 화요일
		System.out.println(Calendar.WEDNESDAY);  //--==>>4 -> 수요일
		System.out.println(Calendar.THURSDAY);   //--==>>5 -> 목요일
		System.out.println(Calendar.FRIDAY);     //--==>>6 -> 금요일
		System.out.println(Calendar.SATURDAY);   //--==>>7 -> 토요일

		System.out.println();

		String week = "";
		switch (w)
		{
			//case 1: week = "일요일"; break;
			case Calendar.SUNDAY: week = "일요일"; break;

			//case 2: week = "월요일"; break;
			case Calendar.MONDAY: week = "월요일"; break;
			
			//case 3: week = "화요일"; break;
			case Calendar.TUESDAY: week = "화요일"; break;

			//case 4: week = "수요일"; break;
			case Calendar.WEDNESDAY: week = "수요일"; break;

			//case 5: week = "목요일"; break;
			case Calendar.THURSDAY: week = "목요일"; break;

			//case 6: week = "금요일"; break;
			case Calendar.FRIDAY: week = "금요일"; break;

			//case 7: week = "토요일"; break;
			case Calendar.SATURDAY: week = "토요일"; break;

		}

		System.out.println(y + "-" + m + "-" + d + " " + week);
		//--==>> 2021-8-10 화요일

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


		//Calendar 객체 생성
		Calendar rightNow2 = new GregorianCalendar();   //--2번 방법  -> import구문 써줘야함

		String[] week2 = {"일요일","월요일","화요일","수요일","목요일","금요일","토요일"};

		// 달력의 날자 세팅 -> 『set()』 메소드 활용
		rightNow2.set(2021, 11, 24);   //-- ★12월 check~!!!『-1』★ (2021년 12월 24일)

		System.out.println(rightNow2.get(Calendar.DAY_OF_WEEK));
		//--==>> 6

		System.out.println(week2[rightNow2.get(Calendar.DAY_OF_WEEK)-1]);   //-- check~!!!
		//--==>> 금요일


		// 달력의 날짜 세팅 -> 각자의 생년월일

		rightNow2.set(1994, 11, 31);  //1994 12 31                   //-- ★월★ check~!!!

		System.out.println(rightNow2.get(Calendar.DAY_OF_WEEK));
		//--==>> 7

		System.out.println(week2[rightNow2.get(Calendar.DAY_OF_WEEK)-1]);
		//--==>> 토요일

	}
}

▪ 사용자로부터 연, 월을 입력받아 달력을 그려주는(출력하는) 프로그램을 구현 코드 설명📝

/*
○ java.util.Calendar 클래스는
날짜와 시간을 객체 모델링화 한 클래스로
연, 월, 일, 요일, 시, 분, 초 까지의
시간과 날짜와 관련된 정보를 제공한다.
그리고, Calendar 클래스는 추상 클래스이므로 직접 객체를 생성할 수 없으며
실제적인 메소드 구현은 Calendar 클래스의 서브 클래스인
GregorianCalendar 클래스에 정의되어 있다.

시스템으로부터 현재 시스템 시간 정보를 얻어올 때
getInstance() 라는 정적(static) 메소드를 이용하여 객체를 생성할 수 있다.
생성된 Calendar 클래스 객체는 시스템의 현재 날짜와 시간 정보를 가지며,
이 객체가 생성되면 갖고있는 시간 정보들은
get() 메소드를 이용하여 쉽게 가져올(사용할) 수 있다.

getInstance() 메소드는 내부적으로 GregorianCalendar 객체를 생성하여
돌려주기 때문에 GregorianCalendar 객체를 직접 생성하여 시간 정보를
구할 수도 있다.
*/

//○ 실습 문제
//	사용자로부터 연, 월을 입력받아
//	달력을 그려주는(출력하는) 프로그램을 구현한다.
//	단, 만년 달력이 아니라 Calendar 클래스를 활용하여 작성할 수 있도록 한다.

// 실행 예)
// 연도 입력 : 0
// 연도 입력 : 2021
// 월 입력 : -2
// 월 입력 : 16
// 월 입력 : 8

/*
	[ 2021년 8월 ]

  일  월  화  수  목  금  토
 ===========================
   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  31
============================
계속하려면 아무....

*/
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class Test139
{
	public static void main(String[] args) throws IOException
	{



		//내가 푼거---------------------------------------------------------------------
		/*
		Calendar rightNow = new GregorianCalendar();

		Scanner sc = new Scanner(System.in);
		int y,m,w;

		do
		{
			System.out.print("연도 입력 : ");
			y = sc.nextInt();
		}
		while (y<=0);

		do
		{
			System.out.print("월 입력 : ");
			m = sc.nextInt();
		}
		while (m<=0 || m>12);

		rightNow.set(y,m-1,1);    //달력은 무조건 1일부터 시작~!!

		int[] months = {31,28,31,30,31,30,31,31,30,31,30,31};

		String[] week = {"일요일","월요일","화요일","수요일","목요일","금요일","토요일"};

		w = rightNow.get(Calendar.DAY_OF_WEEK);


		System.out.println();
		System.out.printf("\t[ %d년 %d월 ]\n",y,m);
		System.out.println("  일  월  화  수  목  금  토");
		System.out.println(" ===========================");


		for (int i=1; i<w; i++)  //--check~!!
		{
			System.out.println("    ");
		}


		for (int i=1; i<=months[m-1]; i++)   //--check~!!
		{
			System.out.printf("%4d",i);
			w++;

			if(w%7==1)
				System.out.println();
		}
		if (w%7!=1) //--check~!!
		{
			System.out.println();
		}
		
		System.out.println("=============================");
		*/
		
		 
		//-------------- Calendar 의 getActualMaximum() 메소드를 사용해서 푼 것---------
		//BufferedReader 인스턴스 생성
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		// Calendar 인스턴스 생성
		Calendar cal = Calendar.getInstance();

		//주요 변수 선언
		int y, m;  //--년, 월
		int w;     //-- 요일
		int i;     //-- 달력을 그리는 과정에서 사용하게될 변수

		do
		{
			System.out.print("연도 입력 : ");
			y = Integer.parseInt(br.readLine());
		}
		while (y<1);

		do
		{
			System.out.print("월 입력 : ");
			m = Integer.parseInt(br.readLine());
		}
		while (m<1 || m>12);

		// 사용자로부터 입력받은 연(y), 월(m) 이용하여
		// 달력의 날자 세팅
		cal.set(y,m-1,1); //-- check~!!!  월 -1 해주고 일에 1일의 요일 알아야하니까 1입력!!
		//--- 월 구성 시 입력값(m)을 그대로 사용하는 것이 아니라
		//	  입력값에서 1을 뺀 값으로 월을 설정해야 한다.
		//--- 일 구성 시 입력받은 연, 월에 해당하는 1일로 설정해야 한다.
		//    그 날의 요일 확인을 위해서...

		// 요일 가져오기
		w = cal.get(Calendar.DAY_OF_WEEK);

		//테스트
		//System.out.println(w);
		//--==>> 연도 입력 : 2021
		//		 월 입력   : 8
		//		 1 -> 2021년 8월 기준 -> 일요일 -> 2021년 8월 1일은 일요일~!!!

		System.out.println(); 
		System.out.println("\t[ " + y + "년 " +  m + "월 ]\n");
		System.out.println("  일  월  화  수  목  금  토");
		System.out.println(" ===========================");
		

		// 빈칸 공백 발생
		for (i=1; i<w; i++)
			System.out.print("     ");
		//테스트
		//System.out.printf("%4d",1);    //1이 찍히는 위치 테스트

		// ※ Calendar 의 getActualMaximum() 메소드
		//System.out.println(cal.getActualMaximum(Calendar.DATE));
		

		//for (i=1; i<=그월의 마지막 날짜;i++)
		for (i=1; i<=cal.getActualMaximum(Calendar.DATE); i++)
		{
			System.out.printf("%4d",i); 
			w++;   //--반복문을 수행하며 날짜가 증가할 때마다 요일도 함께 증가할 수 있도록 처리

			if(w%7==1)         //전에 했던건 0이었는데 여기선 1!!! 왜냐면 일요일이 1이니까!!
				System.out.println();   //--증가한 요일이 일요일이 될 때 마다 개행 후 출력
		}

		if(w%7!=1)
			System.out.println();

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

		


//1년 1월 1일이 월요일로 배웠는데 이거로 해보면 토요일이 나오는데 왜그런건가요?
// -> GregorianCalendar는 1년 1월 1일이 월요일 아님!! (그레고리력 검색)



	}
}
/*
연도 입력 : 0
연도 입력 : 2021
월 입력 : 0
월 입력 : 13
월 입력 : -2
월 입력 : 8

        [ 2021년 8월 ]
  일  월  화  수  목  금  토
 ===========================
   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  31
=============================
계속하려면 아무 키나 누르십시오 . . .

*/
profile
개발새발

0개의 댓글

관련 채용 정보