<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=%EB%A7%8C%EB%85%84%EB%8B%AC%EB%A0%A5%2F%EA%B9%80%EC%A0%95%ED%98%84</id>
	<title>만년달력/김정현 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=%EB%A7%8C%EB%85%84%EB%8B%AC%EB%A0%A5%2F%EA%B9%80%EC%A0%95%ED%98%84"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EB%A7%8C%EB%85%84%EB%8B%AC%EB%A0%A5/%EA%B9%80%EC%A0%95%ED%98%84&amp;action=history"/>
	<updated>2026-05-15T09:37:48Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=%EB%A7%8C%EB%85%84%EB%8B%AC%EB%A0%A5/%EA%B9%80%EC%A0%95%ED%98%84&amp;diff=50161&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:29, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EB%A7%8C%EB%85%84%EB%8B%AC%EB%A0%A5/%EA%B9%80%EC%A0%95%ED%98%84&amp;diff=50161&amp;oldid=prev"/>
		<updated>2021-02-07T05:29:25Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= 만년달력 만들기 =&lt;br /&gt;
원하는 년도와 달을 입력하면 달력이 출력된다&lt;br /&gt;
&lt;br /&gt;
== 설계 ==&lt;br /&gt;
TimeInfo에서 시간 정보를 얻어와&lt;br /&gt;
CalendarMaker에게 폼을 주고 만들라고 지시한다&lt;br /&gt;
&lt;br /&gt;
== 소스 ==&lt;br /&gt;
 public class TimeInfo {&lt;br /&gt;
 	private static final int BLANK = 1;&lt;br /&gt;
 	private int[] days= {31,28,31,30,31,30,31,31,30,31,30,31};&lt;br /&gt;
 	private String[] dayNames= {&lt;br /&gt;
 		&amp;quot;Sunday&amp;quot;, &amp;quot;Monday&amp;quot;, &amp;quot;Tuesday&amp;quot;, &amp;quot;Wednesday&amp;quot;, &amp;quot;Thursday&amp;quot;, &amp;quot;Friday&amp;quot;, &amp;quot;Saturday&amp;quot;	&lt;br /&gt;
 	};&lt;br /&gt;
 &lt;br /&gt;
 	public int getDaysInMonth(int month) {&lt;br /&gt;
 		if(!isProperMonth(BLANK, month))&lt;br /&gt;
 			return 0;&lt;br /&gt;
 		return days[month-1];&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	public int getDaysInYearMonth(int year, int month) {&lt;br /&gt;
 		if(!isProperMonth(year, month))&lt;br /&gt;
 			return 0;&lt;br /&gt;
 		if(month==2 &amp;amp;amp;&amp;amp;amp; isSpecialYear(year)) {&lt;br /&gt;
 			return getDaysInMonth(month)+1;&lt;br /&gt;
 		}&lt;br /&gt;
 		return getDaysInMonth(month);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	/*&lt;br /&gt;
 	 * 윤달은 언제 생기는가? &lt;br /&gt;
 	 * 4로 나누어 떨어지면서 100으로 나누어 떨어지지 않는 해. &lt;br /&gt;
 	 * 400으로 나누어 떨어지면 무조건 윤달. &lt;br /&gt;
 	 */&lt;br /&gt;
 	private boolean isSpecialYear(int year) {&lt;br /&gt;
 		if(year%400==0) &lt;br /&gt;
 			return true;&lt;br /&gt;
 		if(year%4==0 &amp;amp;amp;&amp;amp;amp; year%100!=0)&lt;br /&gt;
 			return true;&lt;br /&gt;
 		return false;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	public int getDaysInYear(int year) {&lt;br /&gt;
 		if(!isProperMonth(year, BLANK))&lt;br /&gt;
 			return 0;&lt;br /&gt;
 		if(isSpecialYear(year)) {&lt;br /&gt;
 			return 365 + 1;&lt;br /&gt;
 		}&lt;br /&gt;
 		return 365;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	private boolean isProperMonth(int year, int month) {&lt;br /&gt;
 		return ( year &amp;amp;gt; 0 ) &amp;amp;amp;&amp;amp;amp; ( 0 &amp;amp;lt; month &amp;amp;amp;&amp;amp;amp; month &amp;amp;lt;= 12 );&lt;br /&gt;
 	}&lt;br /&gt;
 	private boolean isProperDate(int year, int month, int day) {&lt;br /&gt;
 		return ( year &amp;amp;gt; 0 ) &amp;amp;amp;&amp;amp;amp; ( 0 &amp;amp;lt; month &amp;amp;amp;&amp;amp;amp; month &amp;amp;lt;= 12 ) &lt;br /&gt;
 			&amp;amp;amp;&amp;amp;amp; ( 0 &amp;amp;lt; day &amp;amp;amp;&amp;amp;amp; day &amp;amp;lt;= getDaysInYearMonth(year, month) );&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	public String getDayName(int year, int month, int day) {&lt;br /&gt;
 		if(!isProperDate(year, month, day))&lt;br /&gt;
 			return &amp;quot;&amp;quot;;&lt;br /&gt;
 		int reducedDays= getTotalDaysUntil(year, month, day)%dayNames.length;&lt;br /&gt;
 		return getDayName(reducedDays);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	private String getDayName(int sequence) {&lt;br /&gt;
 		return dayNames[sequence];&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	public int getTotalDaysUntil(int year, int month, int day) {&lt;br /&gt;
 		if(!isProperDate(year, month, day))&lt;br /&gt;
 			return 0;&lt;br /&gt;
 		&lt;br /&gt;
 		int totalDays= 0;&lt;br /&gt;
 		for(int i=1;i&amp;amp;lt;year;i++) {&lt;br /&gt;
 			totalDays += getDaysInYear(i);&lt;br /&gt;
 		}&lt;br /&gt;
 		for(int i=1;i&amp;amp;lt;month;i++) {&lt;br /&gt;
 			totalDays += getDaysInYearMonth(year, i);&lt;br /&gt;
 		}&lt;br /&gt;
 		totalDays += day;&lt;br /&gt;
 		return totalDays;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	public String[] getDayNames() {&lt;br /&gt;
 		return dayNames;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 public class CalendarMaker {&lt;br /&gt;
 	String[] names= {};&lt;br /&gt;
 	int startIndex= 0;&lt;br /&gt;
 	private boolean isReady= false;&lt;br /&gt;
 	private String space= &amp;quot; &amp;quot;;&lt;br /&gt;
 	&lt;br /&gt;
 	public void setForm(String[] dayNames, String space) {&lt;br /&gt;
 		names= dayNames;&lt;br /&gt;
 		this.space= space;&lt;br /&gt;
 	}&lt;br /&gt;
 	public void setMonth(int year, int month, String startName) {&lt;br /&gt;
 		startIndex= -1;&lt;br /&gt;
 		for(int i=0;i&amp;amp;lt;names.length;i++) {&lt;br /&gt;
 			if(startName.equals(names[i])) {&lt;br /&gt;
 				startIndex= i;&lt;br /&gt;
 			}				&lt;br /&gt;
 		}&lt;br /&gt;
 		if(names != null &amp;amp;amp;&amp;amp;amp; startIndex != -1)&lt;br /&gt;
 			isReady= true;&lt;br /&gt;
 	}&lt;br /&gt;
 	public String getResult(int start, int end) {&lt;br /&gt;
 		if(!isReady()) {&lt;br /&gt;
 			return &amp;quot;&amp;quot;;&lt;br /&gt;
 		}&lt;br /&gt;
 		StringWriter sw= new StringWriter();&lt;br /&gt;
 &lt;br /&gt;
 		sw.write(repeatString(&amp;quot; &amp;quot;+space, startIndex));&lt;br /&gt;
 		for(int i=start;i&amp;amp;lt;=end;i++) {&lt;br /&gt;
 			sw.write(String.valueOf(i)+space);&lt;br /&gt;
 			if((startIndex + i)%names.length==0) {&lt;br /&gt;
 				sw.write(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 		return sw.toString();&lt;br /&gt;
 	}&lt;br /&gt;
 	public String getNames(int length) {&lt;br /&gt;
 		StringWriter sw= new StringWriter();&lt;br /&gt;
 		for(String name : names) {&lt;br /&gt;
 			sw.write(name.substring(0, length) + &amp;quot;\t&amp;quot;);&lt;br /&gt;
 		}&lt;br /&gt;
 		return sw.toString();&lt;br /&gt;
 	}&lt;br /&gt;
 	private boolean isReady() {&lt;br /&gt;
 		return isReady;&lt;br /&gt;
 	}&lt;br /&gt;
 	private String repeatString(String string, int repeat) {&lt;br /&gt;
 		if(repeat == 0) &lt;br /&gt;
 			return &amp;quot;&amp;quot;;&lt;br /&gt;
 		return string + repeatString(string, repeat-1);&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	public static void main(String[] args) throws Exception{&lt;br /&gt;
 		TimeInfo timeInfo= new TimeInfo();&lt;br /&gt;
 		CalendarMaker maker= new CalendarMaker();&lt;br /&gt;
 		int year= 0;&lt;br /&gt;
 		int month= 0;&lt;br /&gt;
 		&lt;br /&gt;
 		System.out.println(&amp;quot;input year, month&amp;quot;);&lt;br /&gt;
 		Scanner input= new Scanner(System.in);&lt;br /&gt;
 		year= input.nextInt();&lt;br /&gt;
 		month= input.nextInt();&lt;br /&gt;
 		String startDay= timeInfo.getDayName(year, month, 1);&lt;br /&gt;
 		maker.setForm(timeInfo.getDayNames(), &amp;quot;\t&amp;quot;);&lt;br /&gt;
 		maker.setMonth(year, month, startDay);&lt;br /&gt;
 		System.out.println(maker.getNames(4));&lt;br /&gt;
 		System.out.println(maker.getResult(1, timeInfo.getDaysInYearMonth(year, month)));&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== 테스트 코드 ==&lt;br /&gt;
 public class TestCalendar extends TestCase{&lt;br /&gt;
 	TimeInfo timeInfo= new TimeInfo();&lt;br /&gt;
 	CalendarMaker maker= new CalendarMaker();&lt;br /&gt;
 	&lt;br /&gt;
 	public void setUp() throws Exception {&lt;br /&gt;
 		timeInfo= new TimeInfo();&lt;br /&gt;
 		maker= new CalendarMaker();&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	public void testDayCount() {&lt;br /&gt;
 		assertEquals(31, timeInfo.getDaysInMonth(1));&lt;br /&gt;
 		assertEquals(28, timeInfo.getDaysInMonth(2));&lt;br /&gt;
 		assertEquals(31, timeInfo.getDaysInMonth(12));&lt;br /&gt;
 		&lt;br /&gt;
 		assertEquals(0, timeInfo.getDaysInMonth(0));&lt;br /&gt;
 		assertEquals(0, timeInfo.getDaysInMonth(13));&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	public void testActualDaycount() {&lt;br /&gt;
 		assertEquals(28, timeInfo.getDaysInYearMonth(1999, 2));&lt;br /&gt;
 		assertEquals(29, timeInfo.getDaysInYearMonth(2004, 2));&lt;br /&gt;
 		assertEquals(28, timeInfo.getDaysInYearMonth(2100, 2));&lt;br /&gt;
 		&lt;br /&gt;
 		assertEquals(0, timeInfo.getDaysInYearMonth(0, 2));&lt;br /&gt;
 		assertEquals(0, timeInfo.getDaysInYearMonth(2000, 13));&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	public void testAcutalDayCountInYear() {&lt;br /&gt;
 		assertEquals(365, timeInfo.getDaysInYear(2003));&lt;br /&gt;
 		assertEquals(366, timeInfo.getDaysInYear(2000));&lt;br /&gt;
 		&lt;br /&gt;
 		assertEquals(0, timeInfo.getDaysInYear(0));&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	public void testTotalDays() {&lt;br /&gt;
 		assertEquals(1, timeInfo.getTotalDaysUntil(1,1,1));&lt;br /&gt;
 		assertEquals(365, timeInfo.getTotalDaysUntil(1,12,31));&lt;br /&gt;
 		assertEquals(365*2, timeInfo.getTotalDaysUntil(2,12,31));&lt;br /&gt;
 		assertEquals(365*4+1, timeInfo.getTotalDaysUntil(4,12,31));&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	public void testDayName() {&lt;br /&gt;
 		assertEquals(&amp;quot;Monday&amp;quot;, timeInfo.getDayName(1,1,1));&lt;br /&gt;
 		assertEquals(&amp;quot;Sunday&amp;quot;, timeInfo.getDayName(1,1,14));&lt;br /&gt;
 		assertEquals(&amp;quot;Thursday&amp;quot;, timeInfo.getDayName(2007,4,26));&lt;br /&gt;
 		&lt;br /&gt;
 		assertEquals(&amp;quot;&amp;quot;, timeInfo.getDayName(2000,2,30));&lt;br /&gt;
 		assertEquals(&amp;quot;&amp;quot;, timeInfo.getDayName(2007,4,32));&lt;br /&gt;
 	}&lt;br /&gt;
 	public void testInitialMaker() {&lt;br /&gt;
 		CalendarMaker maker= new CalendarMaker();&lt;br /&gt;
 		maker.setForm(timeInfo.getDayNames(), &amp;quot; &amp;quot;);&lt;br /&gt;
 		assertEquals(&amp;quot;&amp;quot;, maker.getResult(1,4));&lt;br /&gt;
 		&lt;br /&gt;
 	}&lt;br /&gt;
 	public void testMakingCarendar() {&lt;br /&gt;
 		maker.setForm(timeInfo.getDayNames(), &amp;quot; &amp;quot;);&lt;br /&gt;
 		maker.setMonth(1,1,&amp;quot;Monday&amp;quot;);&lt;br /&gt;
 		String result= maker.getResult(1,4);&lt;br /&gt;
 		result.replaceAll(&amp;quot;\t&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 		assertEquals(&amp;quot;  1 2 3 4 &amp;quot;, result);&lt;br /&gt;
 		assertEquals(&amp;quot;  1 2 3 4 5 6 \n7 8 9 10 11 12 13 \n&amp;quot;, maker.getResult(1,13));&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[토이]] [[만년달력]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>