본문 바로가기

Java/본격 Java 퀴즈 기초

[Java] 달력 출력하기

달력을 출력하기에 앞서

굉장히 시간이 오래걸리고 많이 찾아본 코드이다.

윤년을 계산해야하고

달마다 마지막 날짜가 다르며

정확한 값을 입력했는지도 확인해야 한다.

.

.

package ex8;
import java.util.*;

public class Date {
	private int day, month, year;
	private int[] MAX_DAYS = new int[] {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 평년
	private int[] LEAP_MAX_DAYS = new int[] {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 윤년
	
	public Date(int year, int month, int day) {
		this.day = day;
		this.month = month;
		this.year = year;
	}
	public Date() {	} // default 생성자 - printCalader 이용

	public int getDay() { return day; }
	public void setDay(int day) { this.day = day; }
	public int getMonth() { return month; }
	public void setMonth(int month) { this.month = month; }
	public int getYear() { return year; }
	public void setYear(int year) { this.year = year; }
	public void getDate(int year, int month, int day) {}
	
	public void printCalander() {
		int calYear, calMonth;
		Scanner sc = new Scanner(System.in);
		System.out.print("연도를 입력해주세요.");
		calYear = sc.nextInt();
		System.out.print("월을 입력해주세요.");
		calMonth = sc.nextInt();
		
		int firstDay = getDayOfWeek(calYear, calMonth, 1); // 첫째날 요일 계산
		int lastDay = getMaxDayOfMonth(calYear, calMonth); // 마지막날 날짜 계산
		
		
		
		System.out.printf("<<< %5d년 %4d월 >>>> \n", calYear, calMonth);
		System.out.println(" SU MO TU WE TH FR SA");
		System.out.println("---------------------");
		
		// 첫 주 출력
		int count = 7 - firstDay;
		int delim = count < 7 ? count : 0;
		for(int i=0; i< firstDay; i++){ // 첫 주 날짜 공백 출력
			System.out.print("   ");
		}
		
		for(int i = 1; i <= count; i++) {
			System.out.printf("%3d", i);
		}
		count++;
		System.out.println();
		
		// 둘째 주부터 출력
		for(int i=count ; i <= lastDay; i++){
			System.out.printf("%3d", i);
			if(i % 7 == delim){
				System.out.println();
			}
		}
		System.out.println();
		
	}
	
	// 평년과 윤년을 계산하여 마지막 날짜 출력 메소드
	public int getMaxDayOfMonth(int year, int month){
		if(isLeapYear(year)){
			return LEAP_MAX_DAYS[month -1];
		}else{
			return MAX_DAYS[month-1];
		}
	}
	
	// 윤년 검사
	public boolean isLeapYear() {
		if((year / 4 == 0 && year / 100 != 0) || year / 400 == 0) {
			System.out.println("윤년입니다.");
			return true;	
		}
		else {
			System.out.println("윤년이 아닙니다.");
			return false;
		}
	}
	
	public boolean isLeapYear(int year) {
		if((year / 4 == 0 && year / 100 != 0) || year / 400 == 0) {
			System.out.println("윤년입니다.");
			return true;	
		}
		else {
			System.out.println("윤년이 아닙니다.");
			return false;
		}
	}
	
	public boolean isValidDate() {
		if(year >= 1 && year <= 9999) {
			if(month >= 1 && month <= 12) {
				if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
					if(day < 1 || day > 31) {
						System.out.println("정확한 날짜를 입력해주세요.(1~31)");
						return false;
					}else {
						return true;
					}
				}else if(month == 4 || month == 6 || month == 9 || month == 11) {
					if(day < 1 || day > 30) {
						System.out.println("정확한 날짜를 입력해주세요.(1~30)");
						return false;
					}else {
						return true;
					}
				}else if(month == 2) {
					if(isLeapYear()) {
						if(day < 1 || day > 29) {
							System.out.println("정확한 날짜를 입력해주세요.(1~29)");
							return false;
						}
						else {
							return true;
						}
					}else if(!isLeapYear()){
						if(day < 1 || day > 28) {
							System.out.println("정확한 날짜를 입력해주세요.(1~28))");
							return false;
						}else {
							return true;
						}
					}
				}
			}else {
				System.out.println("정확한 월을 입력해주세요.(1~12)");
				return false;
			}
		}else {
			System.out.println("정확한 연도를 입력해주세요.(1~9999)");
			return false;
		}
		return true;
	}
	
	public int getDayOfWeek() {
		int yearNum1 = 0, yearNum2 = 0, monthNum = 0;
		
		if((year >= 1700 && year < 1800) || (year >= 2100 && year < 2200)) {
			yearNum1 = 4;
			yearNum2 = year % 100;
		} 
		else if((year >= 1800 && year < 1900) || (year >= 2200 && year < 2300) ) {
			yearNum1 = 2;
			yearNum2 = year % 100;
		} 
		else if((year >= 1900 && year < 2000) || (year >= 2300 && year < 2400)) {
			yearNum1 = 0;
			yearNum2 = year % 100;
		} 
		else if((year >= 2000 && year < 2100) || (year >= 2400 && year < 2500)) {
			yearNum1 = 6;
			yearNum2 = year % 100;
		}else {
			System.out.println("유효하지 않은 년도 입니다.");
		}
		
		if(isLeapYear()) {
			switch(month) {
			case 10 :
				monthNum = 0; break;
			case 3 : case 11 :
				monthNum = 3; break;
			case 1 : case 4 : case 7 :
				monthNum = 6; break;
			case 5 : 
				monthNum = 1; break;
			case 6 : 
				monthNum = 4; break;
			case 2 : case 8 :
				monthNum = 2; break;
			case 9 : case 12 :
				monthNum = 5; break;
			}
		}else {
			switch(month) {
			case 1 :  case 10 :
				monthNum = 0; break;
			case 2 : case 3 : case 11 :
				monthNum = 3; break;
			case 4 : case 7 :
				monthNum = 6; break;
			case 5 : 
				monthNum = 1; break;
			case 6 : 
				monthNum = 4; break;
			case 8 :
				monthNum = 2; break;
			case 9 : case 12 :
				monthNum = 5; break;
			}
		}
		return (yearNum1 + yearNum2 + (yearNum2 / 4) + monthNum + day) % 7;
		// 0 일요일, 1 월요일, 2 화요일, 3 수요일, 4 목요일, 5 금요일, 6 토요일
	}
	
	public int getDayOfWeek(int year, int month, int day) {
		int yearNum1 = 0, yearNum2 = 0, monthNum = 0;
		
		if((year >= 1700 && year < 1800) || (year >= 2100 && year < 2200)) {
			yearNum1 = 4;
			yearNum2 = year % 100;
		} 
		else if((year >= 1800 && year < 1900) || (year >= 2200 && year < 2300) ) {
			yearNum1 = 2;
			yearNum2 = year % 100;
		} 
		else if((year >= 1900 && year < 2000) || (year >= 2300 && year < 2400)) {
			yearNum1 = 0;
			yearNum2 = year % 100;
		} 
		else if((year >= 2000 && year < 2100) || (year >= 2400 && year < 2500)) {
			yearNum1 = 6;
			yearNum2 = year % 100;
		}else {
			System.out.println("유효하지 않은 년도 입니다.");
		}
		
		if(isLeapYear()) {
			switch(month) {
			case 10 :
				monthNum = 0; break;
			case 3 : case 11 :
				monthNum = 3; break;
			case 1 : case 4 : case 7 :
				monthNum = 6; break;
			case 5 : 
				monthNum = 1; break;
			case 6 : 
				monthNum = 4; break;
			case 2 : case 8 :
				monthNum = 2; break;
			case 9 : case 12 :
				monthNum = 5; break;
			}
		}else {
			switch(month) {
			case 1 :  case 10 :
				monthNum = 0; break;
			case 2 : case 3 : case 11 :
				monthNum = 3; break;
			case 4 : case 7 :
				monthNum = 6; break;
			case 5 : 
				monthNum = 1; break;
			case 6 : 
				monthNum = 4; break;
			case 8 :
				monthNum = 2; break;
			case 9 : case 12 :
				monthNum = 5; break;
			}
		}
		return (yearNum1 + yearNum2 + (yearNum2 / 4) + monthNum + day) % 7;
		// 0 일요일, 1 월요일, 2 화요일, 3 수요일, 4 목요일, 5 금요일, 6 토요일
	}
	
	public String toString() {
		String dd, mm, yyyy;
		if(day < 10) {dd = "0" + Integer.toString(day);}
		else {dd = Integer.toString(day);}
		
		if(month < 10) {mm = "0" + Integer.toString(month);}
		else {mm = Integer.toString(month);}
		
		yyyy = Integer.toString(year);
		
		return dd + "/" + mm + "/" + yyyy;
	}
	
	public String toString(Date d) {
		String sentence = "";
		if(isValidDate()) {
			switch(getDayOfWeek()) {
			case 0 :
				sentence += d.year + "년 " + d.month + "월 " + d.day + "일 " + "일요일"; break;
			case 1 :
				sentence += d.year + "년 " + d.month + "월 " + d.day + "일 " + "월요일"; break;
			case 2 :
				sentence += d.year + "년 " + d.month + "월 " + d.day + "일 " + "화요일"; break;
			case 3 :
				sentence += d.year + "년 " + d.month + "월 " + d.day + "일 " + "수요일"; break;
			case 4 :
				sentence += d.year + "년 " + d.month + "월 " + d.day + "일 " + "목요일"; break;
			case 5 :
				sentence += d.year + "년 " + d.month + "월 " + d.day + "일 " + "금요일"; break;
			case 6 :
				sentence += d.year + "년 " + d.month + "월 " + d.day + "일 " + "토요일"; break;
			}
		}
		return sentence;
	}
	
}

.

.

일단 전체 코드를 적어놓고 세분화 해야할거같다.

.

.

package ex8;

public class TestDate {

	public static void main(String[] args) {
		Date date1 = new Date(2020, 3, 21);
		System.out.println(date1);
		System.out.println(date1.toString(date1));
		
		Date date_test = new Date();
		date_test.printCalander(); // 스캐너로 입력받아 실행한다.
		//date1.printCalander();
	}

}
728x90
반응형