Ex26_Calendar

camicomi·2024년 1월 9일

package com.test.java;

import java.util.Calendar;

public class Ex26_Calendar {

public static void main(String[] args) {

	
	// 달력 만들기
	// 1. 해당 년월의 마지막 일
	// 2. 해당 년월의 1일의 요일
	
	
	// int year = 2024;
	// int month = 1;
	
	
	for (int i=1; i<12; i++) {
		printCalendar(2024, 1);
	}
	
	// 오늘 달력은 캘린더 사용
	
	Calendar now = Calendar.getInstance();
	
	printCalendar(now.get(Calendar.YEAR), now.get(Calendar.MONTH) + 1);
	
	
	
}

public static void printCalendar(int year, int month) {

	
	int lastDay = getLastDay(year, month); //코드가 길어서 메소드로 따로 뺀다
	int dayOfWeek = getDayOfWeek(year, month);
	
	// System.out.println(lastDay);
	// System.out.println(dayOfWeek); 
	
	System.out.println("====================================================");
	System.out.printf("                    %d년 %02d월\n", year, month);
	System.out.println("====================================================");
	System.out.println("[일]\t[월]\t[화]\t[수]\t[목]\t[금]\t[토]");
	
	for (int i=0; i<dayOfWeek; i++) {
		System.out.println("\t"); // 1일이 어떤 요일인지에 따라 t찍기, 해당 년월의 1일의 요일 갯수만큼 
	}

	for (int i=1; i<=lastDay; i++) {
		System.out.printf("%3d\t", i);
		
		//토요일 개행
		// if (i % 7 == 6)
		if ((i + dayOfWeek) % 7 == 0) {
			System.out.println();
		}
	}
}

private static int getLastDay(int year, int month) {
	
	
	switch (month) {
	
	case 1: case 3: case 5: case 7: case 8: case 10: case 12:
		return 31;
		
	case 4: case 6: case 9: case 11:
		return 30;
	case 2:
		return isLeafYear(year) ? 29 : 28; // 윤년 검사 메소드 만들기 true 면 29 , false 면 28 
		
	}
	
	
	return 0; // 빠지면 에러남 안전장치,,,,유효성 검사처럼 
}


// 메서드명 패턴
// 1. 반환값 getXXX() --- RETURN 값 얻기 위해
// 2. setXXX(인자값) --- 값을 넣어주기 위해
// 3. boolean isXXX () 


private static int getDayOfWeek(int year, int month) {
	
	
	// 서기 1년 1월 1일 ~ 2024년 4월 9일
	int date = 1;

	int sum = 0; // 누적 변수
	
	//1. 1년 1월 1일 ~ 2023년 12월 31일 > 1년 365일 
	
	for (int i=1; i<year; i++) {
		sum +=365; 
		
		if (isLeafYear(i))
		sum++; //윤년일때마다 더함
	}
	


//2. 2024년 1월 1일 ~ 2024년 3월 31일 > 1달씩
for (int i=1; i<month; i++) {
	sum += getLastDay(year, i);
	
}

//3. 2024년 1월 9일
sum += date;


	
	return sum % 7; //요일반환
	

}

private static boolean isLeafYear(int year) {
	
if (year % 4 == 0) {
		
		if (year % 100 == 0) {
			
			if (year % 400 ==0) {
				return true; //윤년
			} else {
				return false;
			}
			
		} else {
			return true;
		} // 안떨어지면 '윤년'
		
		
	} else {
		return false;
		
		
	} // 떨어지지 않으면 '평년'
}

}

profile
공부기록

0개의 댓글