Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

Full-Stack 개발자가 되려는 작은 개발자의 블로그

Java를 이용한 달력 프로그램 본문

강의 정리/Java

Java를 이용한 달력 프로그램

jhjin 2020. 3. 8. 20:55

1.작성자의 소스코드

package test0306;

import java.util.Scanner;

public class CalendarProgram {
	public static void main(String[] args) {
		Scanner scan =new Scanner(System.in);
		int startDay=1; //1은 월요일을 의미
		System.out.println("년도 입력 :");
		int year = scan.nextInt();
		System.out.println("월 입력 :");
		int month= scan.nextInt();
		int preMonthDays=0;
		int day=1;
		boolean flag=false;
        
		for(int i=1;i<=year;i++) {
			for(int m=1;m<=12;m++) {
				if(i==year&&flag) {
					break;
				}
				switch(m) {
				case 1:
				case 3:
				case 5:
				case 7:
				case 8:
				case 10:
				case 12:
					if(m==month&&i==year) {
						preMonthDays=31;
						flag=true;
					}else {
						startDay=(startDay+31)%7;
					}
					break;
				case 2:
					if(m==month&&i==year) {
						if(((i%4==0)&&(i%100!=0))||(i%400)==0) {
							preMonthDays=29;
							flag=true;
						}else {
							preMonthDays=28;
							flag=true;
						}
						break;
					}else {
						if(((i%4==0)&&(i%100!=0))||(i%400)==0) {
							startDay=(startDay+29)%7;
						}else {
							startDay=(startDay+28)%7;
						}
						break;
					}
				case 4:
				case 6:	
				case 9:
				case 11:
					if(m==month&&i==year) {
						preMonthDays=30;
						flag=true;
					}else {
						startDay=(startDay+30)%7;
					}
				}	
			}
		}		
		System.out.println(year+"년                  "+month+"월");
		System.out.println("======================");
		System.out.println("  일  월  화  수  목  금  토");
		System.out.println("======================");
		for(int j=0;j<startDay;j++) {
			System.out.print("   ");
		}
		for(int d=1;d<=preMonthDays;d++) {
			if(startDay==7) {
				startDay=0;
				System.out.println();	
			}
			for(int i=0;i<7;i++) {
				if(i==startDay){
					System.out.printf("%3d",d);	
					day+=1;
				}
			}
			startDay+=1;
		}		
	}
}

달력 프로그램의 결과물

2.교수님의 소스코드(분석)

import java.util.Scanner;

public class CalendarProgramSample {
   public static void main(String[] args) {
      //사용자의 입력을 받을 스캐너 객체 선언 및 생성
      Scanner scan = new Scanner(System.in);

      //출력할 년도와 달을 입력받을 변수를 선언 및 0으로 초기화 한다.
      int year = 0, month = 0;
      //총 일수를 담을 변수를 선언 및 0으로 초기화한다.
      int totalDay = 0;
      //해당 달의 날짜를 받을 변수를 선언 및 0으로 초기화 한다.
      int dayOfMonth = 0;
      //해당 달의 시작 날짜를 받을 변수를 선인 및 1로 초기화한다.(1년 1월 1일은 월요일)
      int startDay = 1;

      //년도와 달을 입력하라는 출력 문구 및 생성한 Scanner객체를 통해 year,month 변수에 값을 입력한다.
      System.out.println("연도와 월을 입력하세요.");
      System.out.print("연도 : ");
      year = scan.nextInt();
      System.out.print("월 : ");
      month = scan.nextInt();

      //변수 i는 1년부터 내가 입력한 년도 전까지 반복한다.(2020을 입력하면 2019년도까지 총 일수를 구한다.)
      for (int i = 1; i < year; i++) {
         //총 일수에 365일을 더한다.
         totalDay += 365;
         //만약 윤년 계산식을 통해 해당 년도가 윤년이라면
         if (((i % 4) == 0) && ((i % 100) != 0) || ((i % 400) == 0)) {
            //총 일수에 하루를 더 더해준다.(윤년은 29일까지 있으므로)
            totalDay++;
         }
      }

      //해당 년도 1월부터 입력 달 전까지 반복한다. ->전까지 반복해야 입력 달의 시작 날짜를 구할 수 있다.
      for (int j = 1; j < month; j++) {
         //4,6,9,11월이라면
         if (j == 4 || j == 6 || j == 9 || j == 11) {
            //총 일수에 30을 더한다.
            totalDay += 30;
         } else if (j == 2) { //2월이라면
            //윤년인지 확인 후 윤년이라면
            if (((year % 4) == 0) && ((year % 100) != 0) || ((year % 400) == 0)) {
               //총 일수에 29를 더한다.
               totalDay += 29;
            } else { //윤년이 아니라면
               //총 일수에 28을 더한다.
               totalDay += 28;
            }
         } else { //그리고 나머지 월들은
            //총 일수에 31을 더한다.
            totalDay += 31;
         }
      }
      //총 일수를 7로 나눈 후 나머지가 내가 입력한 연도의 해당 달의 시작일이다.
      startDay =(startDay+ totalDay )% 7;

      // --------------------------------------------------------------
      //내가 입력한 달이 4,6,9,11월이면
      if (month == 4 || month == 6 || month == 9 || month == 11) {
         //해당 달의 일수를 30으로 저장
         dayOfMonth = 30;
      } else if (month == 2) { //2월이라면
         //윤년이라면
         if (((year % 4) == 0) && ((year % 100) != 0) || ((year % 400) == 0)) {
             //해당 달의 일수를 29으로 저장
            dayOfMonth = 29;
         } else { //윤년이 아니라면
             //해당 달의 일수를 28으로 저장
            dayOfMonth = 28;
         }
      } else { //그 이외의 달이라면 31을 더한다.
         dayOfMonth = 31;
      }

      // --------------------------------------------------------------

      System.out.println();
      System.out.println(year + "년\t\t\t\t\t\t" + month + "월");
      System.out.println("===================================================");
      System.out.println("일\t월\t화\t수\t목\t금\t토");
      System.out.println("===================================================");

      // --------------------------------------------------------------
      //시작일이 일요일이 아닌 경우 해당 요일전까지 공백을 출력하기 위해
      //일요일부터 해당 시작일 전까지 반복한다.
      for (int k = 0; k < startDay; k++) { 
         //tab만큼 띄워준다.
         System.out.print("\t");
      }

      // --------------------------------------------------------------
      //1일부터 해당 달의 일수만큼 반복한다.
      for (int l = 1; l <= dayOfMonth; l++) {
         //날짜를 찍어준다.
         System.out.printf("%2d", l);
         //다음 요일로 위치를 증가시켜준다.
         startDay++;
         //만약 시작 위치가 7로 나눠떨어진다면(즉 토요일을 벗어난다면)
         if (startDay % 7 == 0) {
            //줄바꿈을 한다.
            System.out.println();
         } else { //아직 토요일이 되지 않았다면
            //일마다 간격을 준다.
            System.out.print("\t");
         }
      }
      scan.close();
   }// main 끝

}// 클래스 끝

'강의 정리 > Java' 카테고리의 다른 글

Java를 이용한 학생 관리 프로그램/가계부 프로그램  (0) 2020.03.11
Java 기초 실습5  (0) 2020.03.09
Java 기초 실습4  (0) 2020.03.05
Java 기초 실습3  (1) 2020.03.04
Java 기초 실습2  (1) 2020.03.03
Comments