= 만년달력 만들기 = 원하는 년도와 달을 입력하면 달력이 출력된다 == 설계 == TimeInfo에서 시간 정보를 얻어와 CalendarMaker에게 폼을 주고 만들라고 지시한다 == 소스 == {{{ public class TimeInfo { private static final int BLANK = 1; private int[] days= {31,28,31,30,31,30,31,31,30,31,30,31}; private String[] dayNames= { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; public int getDaysInMonth(int month) { if(!isProperMonth(BLANK, month)) return 0; return days[month-1]; } public int getDaysInYearMonth(int year, int month) { if(!isProperMonth(year, month)) return 0; if(month==2 && isSpecialYear(year)) { return getDaysInMonth(month)+1; } return getDaysInMonth(month); } /* * 윤달은 언제 생기는가? * 4로 나누어 떨어지면서 100으로 나누어 떨어지지 않는 해. * 400으로 나누어 떨어지면 무조건 윤달. */ private boolean isSpecialYear(int year) { if(year%400==0) return true; if(year%4==0 && year%100!=0) return true; return false; } public int getDaysInYear(int year) { if(!isProperMonth(year, BLANK)) return 0; if(isSpecialYear(year)) { return 365 + 1; } return 365; } private boolean isProperMonth(int year, int month) { return ( year > 0 ) && ( 0 < month && month <= 12 ); } private boolean isProperDate(int year, int month, int day) { return ( year > 0 ) && ( 0 < month && month <= 12 ) && ( 0 < day && day <= getDaysInYearMonth(year, month) ); } public String getDayName(int year, int month, int day) { if(!isProperDate(year, month, day)) return ""; int reducedDays= getTotalDaysUntil(year, month, day)%dayNames.length; return getDayName(reducedDays); } private String getDayName(int sequence) { return dayNames[sequence]; } public int getTotalDaysUntil(int year, int month, int day) { if(!isProperDate(year, month, day)) return 0; int totalDays= 0; for(int i=1;i