[Java] 캘린더 만들기 - 자동으로 요일을 계산하는 달력

나영원·2020년 8월 24일
0

Java_basic

목록 보기
19/60

앞에서 수동으로 시작하는 요일을 입력하는 달력에서 연과 월을 입력하면 자동으로 시작하는 요일을 계산해서 출력해주는 달력을 만들어보겠습니다.

		public static int getWeekDay(int year, int month, int day) {
		
		int syear = 1970; // 목요일
		final int STANDARD_WEEKDAY = 4; //1970/Jan/1st = Thursday
		
		int count = 0;
		
		for (int i = syear; i < year; i++ ) {
			
			int delta = isLeapYear(i) ? 366:365;
			count += delta;			
		}
			
		for (int i = 1; i <month; i ++) {
			
			int delta = getMaxDaysOfMonth(year, i);
			count += delta;
		}
		
		count += day -1;
		
		//System.out.println(count);
		
		int weekday = (count + STANDARD_WEEKDAY) % 7;
		
		return weekday;
	}

먼저 Calendar 클래스에 요일을 구하는 getWeekDay 메소드를 만들어 보겠습니다.

달력의 요일을 계산하는 방법은 여러가지가 있지만 그중에 기준이 되는 날짜로 부터 몇일이 지났는지를 계산해서 요일을 구하는 방식으로 선택하고 기준이 되는 날을 1970년 1월1월 목요일로 정합니다.

기준년을 1970년을 syear로 변수를 선언하고 기준요일인 목요일 숫자 4으로 변환해 변수로 선언합니다. (일요일=0, 월요일=1... 목요일 =4)

연수에 따라 지나간 날짜를 계산하기 위한 반목문을 작성해 syear~year까지 윤년여부에 따라 366 or 365를 더하게 합니다.

월수에 따라 지나간 날짜를 계산하기 위해 반복문을 한번더 작성해 이번엔 getMaxDaysOfMonth 메소드를 활용해서 더해줍니다.

마지막으로 count에 입력된 day -1을 더해주고(-1을 하는 이유는 1일은 +1을 해줄 필요가 없기 때문입니다.) weekday 변수를 선언해 count+기준요일 해주고 7로 나눈 나머지를 구해줍니다.

public void printCalendar(int year, int month) {
		System.out.printf("   <<%d년 %d월>>\n", year, month);
		System.out.println(" SU MO TU WE TU FR SA");
		System.out.println("----------------------");
		
		
		int weekday = getWeekDay(year, month, 1);
		
		
		for (int i = 0; i < weekday; i++) {
			
			System.out.print("   ");
		}
			
		int maxDay = getMaxDaysOfMonth(year, month);
		int count = 7 - weekday;
		int delim = (count < 7)? count:0;
			
		
		
		for(int i = 1; i <= count; i++) {
			System.out.printf("%3d", i);
			
		}
		System.out.println();

		
		for (int j = count+1; j <= maxDay; j++) {
			System.out.printf("%3d", j);
			if (j % 7 == delim) {
				System.out.println();
			}
		}
		System.out.println();
		
			
		}
		
	}

이전에 작성해 놓은 printCalendar에 weekday변수에 getWeekDay메소드를 넣어주고 year, month는 입력받을 값으로 넣어주고 day는 매달 1을 기준으로 달력이 작성되기에 1을 넣어줍니다.

마지막으로 Prompt 클래스에서 요일을 입력값을 받던 부분을 지우서 연도와 월만 입력받을 수 있게 수정해줍니다. (코드생략)

결과값

연도를 입력하세요.(exit: -1)
YEAR> 2020
월을 입력하세요:
MONTH> 7
   <<20207>>
 SU MO TU WE TU FR SA
----------------------
           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

연도를 입력하세요.(exit: -1)
YEAR> 2020
월을 입력하세요:
MONTH> 8
   <<20208>>
 SU MO TU WE TU FR SA
----------------------
                    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

연도를 입력하세요.(exit: -1)
YEAR> 

연도와 월을 입력하면 입력한 월의 1일의 요일이 자동으로 계산되는 달력이 구현되었습니다.

profile
배우는 개발 일기

0개의 댓글