📚 Study/Java

JAVA :: Test143_자바에서 기본적으로 제공하는 주요 클래스들( Calendar 클래스_달력 구해주는 프로그램 구현)

bono-hye 2023. 9. 21. 00:29

○ 실습

사용자로부터 연, 월을 입력받아

달력을 구해주는(출력하는) 프로그램을 구현한다.

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

※ API Document 참조하여 getActualMaximum() 메소드의 활용 방법 검토할 것 ~!!!

 

실행 예)

연도 입력 : 0

연도 입력 : 2024

월 입력 : -10

월 입력 : 13

월 입력 : 5

 

[ 2024년 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 31

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

 

▼ 내가 작성한 코드

import java.util.Calendar;
import java.util.Scanner;

public class Test143
{
	public static void main(String[] args)
	{	
		Scanner sc = new Scanner(System.in);
		int y, m, d, w;					// 연, 월, 일, 요일
		d = 1;
		
		do
		{
			System.out.print("연도 입력 : ");
			y = sc.nextInt();
		}
		while (y<1);
		
		do
		{
			System.out.print("월 입력   : ");
			m = sc.nextInt();
		}
		while (m<1 || m>12);
		
		System.out.printf("    [ %d년 %d월 ]\n", y, m);
		System.out.println();
		System.out.println(" 일  월  화  수  목 금 토");
		System.out.println("=========================");
		
		Calendar cal = Calendar.getInstance();	// Calender 객체 생성 
		
		cal.set(y, m-1, d);
		
		w = cal.get(Calendar.DAY_OF_WEEK);
		
		for (int i=1; i<w; i++)					// 공백 생성. i가 w(요일을 나타냄)보다 작을 때 까지 공백 출력한다.
		{
			System.out.print("   ");
		}

		
		for (int i=1; i<=cal.getActualMaximum(Calendar.DATE); i++)	// i가 1부터 해당 월의 마지막 날 까지 반복문 수행 
		{
			System.out.printf("%3d", i);
			w++;				// 일 수가 증가하면서 일도 증가해야 하므로 w++
			
			if (w % 7 == 1 || i==cal.getActualMaximum(Calendar.DATE))		// 만약 w를 7로 나눴을 때 나머지가 6이라면 즉, w=6(토요일)이라면 개행 또는 i가 해당 월의 마지막 날이면 개행 
				System.out.println();
		}
		System.out.println("=========================");
			
	}
}

 

▼ 같이 작성한 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Calendar;


public class Test143
{
	public static void main(String[] args) throws IOException
	{
		// 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);				// 모든 월은 1일부터 시작하니까 1로 세팅
		//-- 월 구성 시 입력값(m)을 그대로 사용하는 것이 아니라
		//	 입력값에서 1을 뺀 값으로 월을 설정해야 한다.
		//-- 일 구성 시 입력받은 연, 월에 해당하는 1일로 설정해야 한다.
		//	 1일의 요일을 확인해야 달력을 그릴 수 있다.


		// 세팅된 달력의 날짜로부터 요일 가져오기
		w = cal.get(Calendar.DAY_OF_WEEK);

		// 테스트(확인)
		//System.out.println("w : " + w);
		//--==>> 연도 입력 : 2023
		//		 월 입력   : 12
		//	     w : 6 → 2023년 12월 기준 → 금요일 → 2023년 12월 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("    ");	// 공백 4칸 발생
		}

		// 테스트(확인)
		//System.out.printf("%4d", 1);

		// 테스트(확인)
		// System.out.println(cal.getActualMaximum(Calendar.DATE));

		// Calendar 클래스 『getActualMaximum()』 메소드		check~!!!	유효한 최대값을 뽑아내는 메소드	
		for (i=1; i<=cal.getActualMaximum(Calendar.DATE); i++)			
		{
			System.out.printf("%4d", i);
			w++;							//-- 반복문을 수행하며 날짜가 증가할 때 마다
											//   요일도 함께 증가할 수 있도록 처리
			if (w%7==1)						//-- 이렇게 증가한 요일이 일요일이 될 때 마다
				System.out.println();		//   개행 후 출력될 수 있도록 처리	 
		}
		
		if (w%7!=1)							//-- 일요일 개행이 적용되지 않은 경우에만...
			System.out.println();			//-- 개행 처리

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