=== Calendar.java === {{{~cpp public class Calendar { static int DAYS_PER_MONTH[] = {31,28,31,30,31,30,31,31,30,31,30,31}; int year, month; public Calendar(int year, int month) { set(year, month); } public void set(int year, int month) { this.year = year; this.month = month; DAYS_PER_MONTH[1] = isLeapYear(this.year) ? 29 : 28; } protected int getNumOfDays() { return DAYS_PER_MONTH[month - 1]; } public int[] getCalendar() { int ret[] = new int[42]; int start = getMonthStartPoint(); for(int i = start ; i < getNumOfDays() + start ; ++i) ret[i] = i - start + 1; return ret; } protected int getNumOfLeapYears() { int ret = 0; for(int i = 1 ; i < year ; ++i) if( isLeapYear(i) ) ++ret; return ret; } protected int getMonthStartPoint() { int ret = year + getNumOfLeapYears(); for(int i = 0 ; i < month - 1 ; ++i) ret += DAYS_PER_MONTH[i]; return ret % 7; } protected boolean isLeapYear() { return isLeapYear(this.year); } protected boolean isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; } } }}} === CalendarTestCase.java === {{{~cpp import junit.framework.TestCase; public class CalendarTestCaseTest extends TestCase { Calendar calendar = new Calendar(1,1); public CalendarTestCaseTest(String arg) { super(arg); } private int[] getExpectedCalendar(int start) { int ret[] = new int[42]; for(int i = start ; i < calendar.getNumOfDays() + start ; ++i) ret[i] = i - start + 1; return ret; } private void assertEqualsArray(int [] expected) { int real[] = calendar.getCalendar(); for(int i = 0 ; i < 42 ; ++i) assertEquals( expected[i], real[i] ); } public void test1Year() { int expectedSet[] = {1,4,4,0,2,5,0,3,6,1,4,6}; for(int i = 0 ; i < expectedSet.length ; ++i) { calendar.set(1, i + 1); int expected[] = getExpectedCalendar(expectedSet[i]); assertEqualsArray(expected); } } public void test2Year() { int monthSet[] = {1,2,12}; int expectedSet[] = {2,5,0}; for(int i = 0 ; i < monthSet.length ; ++i) { calendar.set(2, monthSet[i]); assertEqualsArray( getExpectedCalendar(expectedSet[i]) ); } } public void test4Year() { int expectedSet[] = {4,0,1,4,6,2,4,0,3,5,1,3}; for(int i = 0 ; i < expectedSet.length ; ++i) { calendar.set(4, i + 1); int expected[] = getExpectedCalendar(expectedSet[i]); assertEqualsArray(expected); } } public void test2003Year() { int expectedSet[] = {3,6,6,2,4,0,2,5,1,3,6,1}; for(int i = 0 ; i < expectedSet.length ; ++i) { calendar.set(2003, i + 1); int expected[] = getExpectedCalendar(expectedSet[i]); assertEqualsArray(expected); } } public void testMonthStartPoint() { int monthSet[] = {1,2,8}; int expectedSet[] = {1,4,3}; for(int i = 0 ; i < monthSet.length ; ++i) { calendar.set(1, monthSet[i]); assertEquals(expectedSet[i], calendar.getMonthStartPoint() ); } } public void testLeapYear() { calendar.set(2000, 1); assertEquals( true, calendar.isLeapYear() ); calendar.set(1999, 1); assertEquals( false, calendar.isLeapYear() ); } } }}} === CalendarFrame.java for GUI === {{{~cpp import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CalendarFrame extends JFrame { class CalendarPanel extends JPanel { JFrame parent; JButton dayUnit[][] = new JButton[6][7]; Calendar calendar; public CalendarPanel() { getContentPane().setLayout( new GridLayout(5,6) ); for(int i = 0 ; i < 6 ; ++i) { for(int j = 0 ; j < 7 ; ++j) { dayUnit[i][j] = new JButton(" "); dayUnit[i][j].setBackground(Color.WHITE); add(dayUnit[i][j]); } } } public void set(int year, int month) { calendar = new Calendar(year, month); int monthArr[] = calendar.getCalendar(); for(int i = 0 ; i < 6 ; ++i) { for(int j = 0 ; j < 7 ; ++j) { if( monthArr[i * 7 + j] > 0 && monthArr[i * 7 + j] < 10) dayUnit[i][j].setText( " " + Integer.toString(monthArr[i * 7 + j]) ); else if( monthArr[i * 7 + j] > 0 && monthArr[i * 7 + j] >= 10) dayUnit[i][j].setText( Integer.toString(monthArr[i * 7 + j]) ); else dayUnit[i][j].setText( " " ); } } } } class InputPanel extends JPanel { JFrame parent; JTextField yearField = new JTextField(); JTextField monthField = new JTextField(); JButton submit = new JButton("보기"); int year, month; public InputPanel() { setLayout( new GridLayout(1,3) ); add(yearField); add(monthField); add(submit); submit.addActionListener( new SubmitListener() ); } class SubmitListener implements ActionListener { public void actionPerformed(ActionEvent ev) { year = Integer.parseInt( yearField.getText() ); month = Integer.parseInt( monthField.getText() ); if( year > 0 && month > 0 ) calendarPanel.set(year, month); } } } InputPanel inputPanel = new InputPanel(); CalendarPanel calendarPanel = new CalendarPanel(); public CalendarFrame(String arg) { super(arg); getContentPane().setLayout( new BorderLayout() ); getContentPane().add(inputPanel, BorderLayout.NORTH); getContentPane().add(calendarPanel, BorderLayout.CENTER); setResizable(false); setSize(400,260); setVisible(true); } public static void main(String[] args) { new CalendarFrame("만년달력"); } } }}}