윤년
요약 태양력에서 2월은 28일까지 있는 것이 평년이다. 그러나 2월을 29일로 둔 해를 윤년이라 하여 치윤법에 따라 400년에 97년을 윤년으로 두고 있다. 이것은 1년의 길이가 365일로 실제보다 0.2422일 짧은 것이므로, 점차 계절과 차이가 발생하게 되는 것을 해결하고자 한 것이다.
원래 2월은 평년이 28일까지 있는 것이지만, 만일 윤년이 없이 언제나 평년이라면 1년의 길이가 365일로 되어 실제보다 0.2422일 짧아지므로 점차 역일(曆日)과 계절이 달라진다. 그러므로 율리우스력에서는 4년마다 2월을 29일로 함으로써 4년간의 연평균 일수를 365.25일로 정하였다. 이 값은 실제보다 1년에 0.0078일이 길다.
그후 그레고리오력에서는 다음과 같은 치윤법(置閏法)을 정하고 시행하였다. 즉, ① 서력 기원 연수가 4로 나누어 떨어지는 해는 우선 윤년으로 하고, ② 그 중에서 100으로 나누어 떨어지는 해는 평년으로 하며, ③ 다만 400으로 나누어 떨어지는 해는 다시 윤년으로 정하였다. 이로써 1년의 평균길이를 365.2425일로 정하여 역에 썼으므로 실제의 1년보다 0.0003일이 길다.
이 그레고리오력에서는 400년간에 97년이 윤년이 된다. 한국에서는 1896년(건양 1)부터 태양력이 쓰였는데 이 역법은 그레고리오력이다. 그레고리오력이 현행의 태양력이다. 율리우스력은 한국에서 사용되지 않았다. 그레고리오력의 치윤법에 의하여 1900년은 평년이었고 2000년은 윤년이 된다.
[네이버 지식백과] 윤년 [leap year, 閏年] (두산백과)
.
.
그러면 윤년을 계산하는 코드를 작성해보자.
윤년은 년도가 4로 나누어지고 100으로 나누어지지 않거나, 400으로 나누어 지는 해이다.
.
.
package ex8;
import java.util.*;
public class Date {
private int day, month, year;
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 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;
}
}
.
.
나중에 달력출력을 위해 윤년확인하는 메소드를 오버로딩했다.
그리고 정확한 날짜를 입력하였는지 확인하는 메소드도 붙여넣었다.
.
.
package ex8;
public class TestDate {
public static void main(String[] args) {
Date date1 = new Date(2020, 3, 21);
System.out.println(date1.isLeapYear());
}
}
.
.
클래스를 메인메소드에서 실행하여야한다.
'Java > 본격 Java 퀴즈 기초' 카테고리의 다른 글
[Java] 사원정보 출력하기 (Composition(포함)관계 이용) (0) | 2020.07.09 |
---|---|
[Java] 달력 출력하기 - 지정한 날짜 요일 확인하기 (0) | 2020.07.08 |
[Java] 달력 출력하기 (0) | 2020.07.08 |
[Java] 계좌 운영하기 (0) | 2020.07.08 |
[Java] 책 정보 입력 (0) | 2020.07.08 |