본문 바로가기

국비교육/국비교육 복습

day16_api.util.calendar_Test04 : Calendar 클래스를 이용한 달력 출력 (★)

사용자에게 연, 월을 입력받아서 해당하는 달의 달력을 보여주세요

 

요구사항

- 달력은 어떠한 연도와 월이든 총 6주치가 나와야 합니다

- 처음 출력되는 날짜는 해당 연도와 월이 아닐 수 있습니다.

- 이전 달이 출력되어야 한다면 이전 달부터 출력합니다

- 한 줄에 한 주치 일자가 출력되어야 합니다.

- 최상단에는 요일 정보가 출력되어야 합니다.

 

 

메인 메소드

package day16_api.util.calendar;

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

public class Test04 {

	public static void main(String[] args) {
		
		// 사용자 입력
		Scanner sc = new Scanner(System.in);
		System.out.print("년도 입력 : ");
		int year = sc.nextInt();
		System.out.print("월 입력 : ");
		int month = sc.nextInt();
		
		// Calendar 생성
		Calendar calendar = Calendar.getInstance();
		
		// 입력받은 년도, 월의 1일로 설정
		// - Calendar에서 MONTH 값이 0일 때 1월을 나타내므로
		//   월로 입력한 숫자에서 1을 빼야 원하는 달을 지정할 수 있다
		calendar.set(year, month - 1 , 1);	
		
		// 입력받은 년도, 월의 1일이 무슨 요일인지
		// - Calendar에서 DAY_OF_WEEK의 값이 1일 때 일요일을 나타낸다
		int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);	
		
		// 일요일에 대한 보정 (Calendar.DAY_OF_WEEK가 1이 되도록)
		// 1일이 일요일이 아닐 때 빼야할 값 
		// ex) 일요일(2)일 때 2 - 1 = 1
		calendar.add(Calendar.DATE, - (dayOfWeek - 1));	
		
		// 출력
		System.out.println(year + "년 " + month + "월의 달력");
		System.out.println("일\t월\t화\t수\t목\t금\t토");
		
		// 달력 형태의 출력을 위한 반복문
		for(int i = 0 ; i < 42 ; i ++) {
			if(i % 7 == 0) {
				System.out.println();
			}
			System.out.print(calendar.get(Calendar.DATE) + "\t");
			calendar.add(Calendar.DATE, 1);
		}
	}
}

 

- Calendar에서 요일(DAY_OF_WEEK)1(일요일) ~ 6(토요일) 까지

 

- Calendar의 상수

상수 의미 반환형
Calendar.YEAR int
Calendar.MONTH int
Calendar.DATE int
Calendar.WEEK_OF_MONTH 요일 (일요일이 0에 해당) int

 

- Calendar의 메소드 일부

메소드 기능 반환형
참조변수명.add(int field, int amount) Calendar의 해당 필드에 지정된 시간을 더하거나 뺀기 void
참조변수명.set(int field, int value) Calendar의 해당 필드에 값를 입력 void
참조변수명.set(int year, int month, int date) Calendar의 year, month date 필드에 값을 입력 void
참조변수명.get(int field) Calendar의 해당 필드의 값을 반환 int

 

** .add(int field, int amount)과 .set(int field, int value)

.add(int field, int amount) 메소드는 필드에 특정 크기(amount)만큼 날짜를 더하거나 뺀다

.set(int field, int value) 메소드는 필드에 특정 날짜값(value)을 지정한다

 

.add(int field, int amount) 메소드가 날짜 초과분에 대한 계산을 할 때 편리하다

 

초기에 작성했던 메인 메소드

package api.util.calander;

import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import java.util.Scanner;

public class Test04_me_explain {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		try {
			
			// 사용자 입력
			System.out.print("년도 입력 : ");
			int year = sc.nextInt();
			
			System.out.print("월 입력 : ");
			int month = sc.nextInt();
			if(month < 1 && month > 12) {
				throw new Exception("월은 1~12 사이의 숫자로 입력해야 합니다");
			}
			
			// Calendar 인스턴스 생성
			Calendar input = Calendar.getInstance();
			
			// 입력한 년, 월의 1일로 설정
			input.set(year, month - 1, 1);
			
			// 총 표시할 날짜의 수
			int row = 6;	// 6개의 주
			int column = 7;	// 7개의 요일
			
			int sunday = 1;	// 일요일일 때 DAY_OF_WEEK의 값은 1이다
			
			// 입력한 년, 월의 1일이 무슨 요일인지
			int dayOfWeek = input.get(Calendar.DAY_OF_WEEK);
			
			System.out.println(year + "년 " + month + "월 달력");
			
			// 입력한 년, 월의 1일이 일요일이라면 (dayOfWeek == 1)
			if(dayOfWeek == 1) {
				for(int i = 1 ; i <= row ; i ++) {
					for(int j = 1 ; j <= column ; j++) {
						// 일요일부터 1일을 입력한 후
						System.out.print(input.get(Calendar.DATE));
						// Calendar의 인스턴스인 input의 일(DATE) 값을 +1만큼 증가시킨다 
						// (다음 회차에 해당 DATE 값을 입력할 수 있도록)
						input.set(Calendar.DATE, input.get(Calendar.DATE) + 1);
						System.out.print("\t");
					}
					System.out.println();
				}
			}
			
			// 입력한 년, 월의 1일이 일요일(1)이 아니라면 (dayOfWeek != 1)
			else {
				// 해당 년, 월의 첫째 주 일요일의 날짜에 해당하는 숫자를 출력할 수 있도록 
				// dayOfWeek에서 1(일요일의 DAY_OF_WEEK)을 뺀 값을 더한다
				input.set(Calendar.DATE, sunday - input.get(Calendar.DATE));
				for(int i = 1 ; i <= row ; i ++) {
					for(int j = 1 ; j <= column ; j++) {
						// 첫째 주 일요일에 해당하는 일(DATE)의 숫자를 입력한 후
						System.out.print(input.get(Calendar.DATE));
						// Calendar의 인스턴스인 input의 일(DATE) 값을 +1만큼 증가시킨다 
						// (다음 회차에 해당 DATE 값을 입력할 수 있도록)
						input.set(Calendar.DATE, input.get(Calendar.DATE) + 1);
						System.out.print("\t");
					}
					System.out.println();
				}
			}
		}
		
		catch(Exception e) {
			if(e.getMessage() == null) {
				System.err.println("입력이 잘못되었습니다");
			}
			else {
				System.out.println("오류 : " + e.getMessage());
			}
		}
		
		finally {
			sc.close();
		}
	}
}