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.
그리고 달력형식으로 출력하기 위해서 1일 전 날들은 공백으로 채울 필요가 있다. for문을 이용해서 다음과 같이 공백을 채웠다.
for (int i = 1; i < nFirstDayOfMonth; i++) { // 시작하는 공백을 채우기위한
System.out.println("ㅁ\t");
}
기본적으로 달력을 출력하고, 추가적으로 인자를 전달해서 원하는 달력을 출력하는 거다. 그래서 두가지를 같은 클래스에서 해결하기 위헤서 인자(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(); // 이부분은 나중에
}
}
getActualMaximum(Calendar.DATE)
을 통해서 쉽게 찾을 수 있다.
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()
한 것을 먼저 실행안하고 실행을 후에 해서 문제가 생겼었다. 순서를 뒤바꿈으로써 문제 해결 되었다.
일~월요일 적은거처럼 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)한다.