[코드스쿼드 코코아 과정_자바] 달력 출력

Kyu·2020년 11월 18일
1

문제 조건

  • 기본으로 현재년도 현재월의 달력을 출력하고 인자로 년도와 월을 입력받으면 해당 월의 달력을 출력해 준다.

해결해야 할 것

  • 현재 달의 첫번째 1일이 언제인가를 찾는 것
  • 출력할때 1일 앞을 빈 공간으로 채우는 것
  • 일~월요일 까지 일 수를 채워넣고 개행하는 것
  • 마지막 일이 언제인가를 찾는 것
  • 1일의 요일이 언제인지 찾아서 달력출력하는데 써야함

1. 1일의 요일을 어떻게 찾아야할까?

1일의 요일을 어떻게 찾아야할까? 일단 DAY_OF_WEEK를 쓰면 정수 1~7로 일~월요일까지 무슨 요일인지 알 수 있다. 그러면 분명히 이번 달의 1일에 대해서 DAY_OF_WEEK을 통해서 무슨 요일인지 알 수 있다.

일단 API 문서에서 전체적으로 어떤 필드변수와 메소드가 있는지 살펴봤다. DATE를 통해서 현재 날짜를 불러올수 있었고 set()메소드를 통해서 DATE필드변수를 1로 변경할 수 있었다. 1로 설정하고 무슨 요일인지 get()메소드를 통해서 DAY_OF_WEEK필드변수를 사용해서 새로운 변수에 저장햇다.

cal.set(Calendar.DATE, 1); // Date를 1로 설정
int nFirstDayOfMonth = cal.get(Calendar.DAY_OF_WEEK); // 무슨 Day인지 get.

2. 출력할때 1일 앞을 빈 공간 만들기

그리고 달력형식으로 출력하기 위해서 1일 전 날들은 공백으로 채울 필요가 있다. for문을 이용해서 다음과 같이 공백을 채웠다.

for (int i = 1; i < nFirstDayOfMonth; i++) { // 시작하는 공백을 채우기위한
	System.out.println("ㅁ\t");
    }

3. 구조 세우기

기본적으로 달력을 출력하고, 추가적으로 인자를 전달해서 원하는 달력을 출력하는 거다. 그래서 두가지를 같은 클래스에서 해결하기 위헤서 인자(parameter)가 있는 생성자를 만든다.

public class Cal {
	private int year;
	private int month;

Cal(int year, int month) {
	this.year = year;
	this.month = month;
	}
 }
 
public class Main {
	public static void main(String[] args) {
    
    		Scanner scan = new Scanner(System.in);
		System.out.println("Year?");
		int year = scan.nextInt();
		System.out.println("Month?");
		int month = scan.nextInt();
		scan.close();
		
		Cal calendar = new Cal(year, month);
		calendar.run(); // 이부분은 나중에
       }
 }

4. 마지막 Day 찾기

getActualMaximum(Calendar.DATE)을 통해서 쉽게 찾을 수 있다.

5. 무슨 요일인지 제대로 get이 안됨

private void init() {
		
		cal.set(Calendar.DATE, 1); // Date를 1로 설정
		int nFirstDayOfMonth = cal.get(Calendar.DAY_OF_WEEK); // 무슨 Day인지 get.

		System.out.println(month + "월\n"); // 무슨 Month인지 출력
		System.out.println("일\t" + "월\t" + "화\t" + "수\t" + "목\t" + "금\t" + "토\n");
		
		for (int i = 1; i < nFirstDayOfMonth; i++) { // 시작하는 공백을 채우기위한
			System.out.print("  \t");

		}
	}

코드자체에 문제가 있었는지 알았는데, 단지 년,월을 set()한 것을 먼저 실행안하고 실행을 후에 해서 문제가 생겼었다. 순서를 뒤바꿈으로써 문제 해결 되었다.

6. 개행하기 (println 하기)

일~월요일 적은거처럼 1~31일도 달력에 표시되는 것처럼 정렬되서 나오길 바랬다. 처음에 이 코드로 작성했는데, 김밥터진거 같이 나왔다.

private void printDates() {
		int endDate = cal.getActualMaximum(Calendar.DATE);
		for (int i = 1; i <= endDate; i++) {
			System.out.print(i+ "\t");
			if (i%7 == 0) {
				System.out.println();
			}
		}

이유는 코드에서 보다시피 단순히 의미없는 변수를 7의 배수가 되면 개행되도록 했기 때문이다. 해결법은 그 변수를 의미있게 바꿔주면 된다. 어떻게? 다음과 같이 말이다.

private void printDates() {
		
		int endDate = cal.getActualMaximum(Calendar.DATE);
		for (int i = 1; i <= endDate; i++) {
			
			cal.set(Calendar.DATE, i);
			System.out.print(i + "\t");

			int j = cal.get(Calendar.DAY_OF_WEEK); 
			if (j % 7 == 0) { 
				System.out.println();
			}
		}
	}

이렇게 DATE를 for문의 변수와 같은 변수로 set 한다. 그리고 돌아가는 로직마다 다음과 같은 코드로 int j = cal.get(Calendar.DAY_OF_WEEK);그게 무슨 요일인지 체크한다. 토요일 (7) 의 배수이면, 즉if (j % 7 == 0) 이면, 개행(println)한다.

profile
TIL 남기는 공간입니다

0개의 댓글