안녕하세요. 인터레스트입니다.

이번 포스팅은 자바프로그램 기본 코스중에서 달력 만들기입니다.

달력의 경우 간단하게 만들려면 자바에서 제공하는 함수를 이용하면 되는데 이런 방식으로 만들면 실제로 달력의 날짜가 어떻게 계산되는지 구조를 알기 힘드므로 여기에서는 Util.Calendar를 이용한 달력과 1년 12달 날짜를 가지고 있는 배열과 윤달, 윤년을 계산하는 방식을 통해서 달력을 출력하는것의 두가지 방식으로 작성을 하고자합니다.

 

프로그램 로직은 둘다 대동소이한데 간단히 설명하자면

1. 원하는 년도와 월을 입력 받습니다.

2. 해당 년도의 월의 1일이 무슨 요일인지 확인합니다.

3. 해당 년도의 월이 며칠까지인지 확인합니다.

5. 1일의 시작 요일 부터 일주일 단위로 출력합니다.

 

 

 

먼저 월별 날짜수를 가진 배열과 윤년 및 1월1일의 요일을 구하는 공식을 이용한 달력 출력하는 프로그램입니다.

실제로는 이런 방법이 아닌 자바에서 제공하는 캘린더 함수를 이용해서 프로그램을 작성하는것이 맞지만 자바가 아닌 다른 언어 혹은 캘린더 관련 함수를 제공하지 않는 C언어 등으로 프로그램을 할때를 위해서 간단하게 구조는 알아두는것이 좋을것 같습니다.

 

이클립스 프로젝트로 만들어진 소스 전체 내용은 아래에 첨부파일로 추가해놓았으니 참고하시면 됩니다.

 

	
public class calendarArray {
          /*
	 * 월별 날짜수를 가진 배열을 이용한 달력 출력하기 자바프로그램  소스
	 */
  	public static void main(String[] args) {         
  		int monthArray[] = {31,28,31,30,31,30,31,31,30,31,30,31}; //1년 12달의 날짜를 기본 세팅함, 배열 0이 1월달임을 염두해서 배열계산해야함           
  		
  		setYear();  // 년도를 입력받음          
  		setMonth(); // 월을 입력받음
  		
  		/*
  		 * 윤년을 체크하기 위함
		 * 4로 나눠서 나머지가 0인데, 100으로 나눠서 나머지가 0이 아니거나 
		 * 400으로 나눠서 나머지가 0인경우 윤년임
  		 */
  		if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0){             
  			monthArray[1] = 29;	//윤년인 경우 2월달을 29일로 세팅        
   		}else{             
   			monthArray[1] = 28;	//윤년이 아닌경우 2월달의 날짜를 28일로 세팅함
    	}         
    
  		/*
  		 * 01년 01월 01일은 월요일이므로 이때부터 계산하여 해당년월 1일의 요일을 구함
  		 * 1년이 지날때마다 요일이 뒤로 하나씩 밀림
  		 * 윤년의 다음년도는 요일이 두개 밀림
  		 * 1년은 365, 1주일은 7일 이므로 기본적으로 년도를 이용해서 해당년 1월1일의 요일을 구하고 이후날짜를 구해서 해당월 1일의 요일을 구함
  		 * 7로 나눈값의 나머지가 0이면 일요일임 
  		 */
    	tempNal = (year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100  + (year - 1) / 400;                   
    	
    	for (i = 0; i < month - 1; i++){             
    		tempNal += monthArray[i];	// 구하는달의 첫번째 날의 수         
    		tempNal += 1;				// 구하고자 하는 달이 1일이 무슨요일인지         
    		week = tempNal % 7;                   
    	}                   
    
    	System.out.println("         " + year + "년   " + month + "월 \n");
    	System.out.println("    월       화       수       목       금       토       일\n");         
    
    	for (i = 0; i < week; i++) {             
    		System.out.print("    "); //1일을 찍기위해서 빈칸이 있는 부분을 채워줌         
    	}         
    
    	for (i = 1; i <= monthArray[month - 1]; i++) {             
    		System.out.printf("%4d", i);             
    		week++;             
    		if (week % 7 == 0){                 
    			System.out.println("\n");             
    		}         
    	}
    	         
    	if (week % 7 != 0){             
    		System.out.println();         
    	}     
    } 

위의 프로그램에 대한 소스는 여기에 있는 calendarArray.zip을 다운받으시면 됩니다.

 

calendarArray.zip



 

 

 

 

 

다음은 자바에서 제공하는 java.util.Calendar를 이용해서 달력을 출력하는 소스입니다.

Calendar를 이용하면 위의 소스보다 훨씬 간단하게 달력을 출력할수있는데 그 이유가 위의 소스에서 계산으로 구했던 해당년월의 1일에 대한 요일 및 해당월의 날짜수를 함수를 통해 알수있기 때문입니다. 그리고 그 함수는 윤년까지 계산해서 알려주기 때문에 별도로 계산할 필요가 없습니다.

 

 

	public CalendarPrint(int year, int month) throws Exception{
		
		if(month<1 || month>12){
			System.out.println("월은 1부터 12까지 입니다.");
			throw new Exception();
		}
		
		if(year<1){
			System.out.println("정확한 년도를 입력해주세요.");
			throw new Exception();
		}
		
		/*
		 * Calendar 인스턴스에 입력받은 년, 월을 세팅하고 날짜는 1일을 세팅함
		 * 입력한 년,월,일을 기준으로 요일을 알아냄
		 * 해당월의 마지막 날짜를 알아냄
		 */
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONTH, month-1);
		cal.set(Calendar.DATE, 1);
		
		startDay = cal.get(Calendar.DAY_OF_WEEK); // 요일을 알아내는 함수 
		lastDay = cal.getActualMaximum(Calendar.DATE); // 해당월의 마지막 날짜를 알아내는 함수
		
		// 2차 배열에 날짜 입력
		/*
		 * 출력하기 위해 2차원 배열에 날짜를 입력함
		 * 숫자를 스트링으로 바꿔서 설정함
		 * 시작요일을 바탕으로 1일 이전은 빈칸으로 놔둠
		 */
		int row = 0;
		for(int i=1; inputDate<=lastDay; i++){
			
			else{
			if( i < startDay ) calDate[row][i-1] = "";  //시작 요일이 오기전에는 공백을 입력함
				calDate[row][(i-1)%width] = Integer.toString(inputDate); // 날짜를 입력함
				inputDate++;

				if(i%width==0) row++; //일주일이 지나면 줄바꿈해서 다음 배열에 입력함
			}		
		}
	}

	// 달력 출력
	public void printCal(){
		
		for(int i = 0; i < width; i++){
			System.out.print(calHeader[i]+"\t"); //월,화,수, 목... 을 TAB으로 띄워서 출력함
		}
		System.out.println();
		
		// 날짜 배열 출력
		int row = 0;
		for(int j = 1 ; j < lastDay + startDay; j++ ){
			System.out.print(calDate[row][(j-1) % width]+"\t"); //2차원 배열 달력 데이터를 하나씩 출력함
			
			if( (j-1) % width == width - 1 ){ //일주일이 지나면 다음 배열을 출력함
				System.out.println();
				row++;
			}
			
		}
	}



아래는 위에서 간단히 보여준 자바에서 제공하는 java.util.calendar를 이용해서 달력을 출력하는 소스입니다.

 

calendarInstance.zip



 

 

이상으로 달력을 출력하는 방법에 대해서 알아봤는데 실제로 업무를 할때 달력을 출력하는일은 없다고 봐도 되고, 단지 Calendar를 이용해서 날짜 계산을 한다던지, 요일을 구해서 특정 요일인 경우에 실행하게 한다던지 하는 경우는 간혹있습니다.

단지 위에서 두가지 버전의 달력을 보여드린 이유는 앞서 말씀드렸다시피 제공되는 함수를 이용하더라도 어떤 방식으로 돌아가는지에 대해서 알고 있으면 나름 도움이 되기 때문입니다.

 

그리고 원리에 대해서 궁금해하고 확인하는 버릇을 들여놓으면 나중에 복잡한 로직을 구현할때도 차근차근 풀이해나가게 되서 금방 해결을 할수있게될거라 생각합니다.

 

 

 

 

 

 


Posted by 인터레스트
,