앞에서 배운 내용을 바탕으로 단계별로 캘린더 만들기를 해보겠습니다.
import java.util.Scanner;
public class DaysA {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("궁금하신 월을 입력하세요");
int input = sc.nextInt();
int[] Maxdays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (input >0 && input <13) {
System.out.printf("%d월은 %d까지 입니다.",input,Maxdays[input-1]);
} else {System.out.println("1~12까지의 숫자를 입력하시오");
}
}
}
먼저 달을 입력받고 Maxdays라는 배열을 만들어 각 월별 최대일수를 저장해놓은 다음 조건문을 통해 각월에 맞는 최대일수를 출력합니다. Maxdays[input-1]인 이유는 입력값은 1~12이지만 배열은 0부터 시작하기에 그 차이를 맞추기 위해 입력값에 -1을 해준 것 입니다.
위의 내용을 메소드를 통해 정리하면 다음과 같습니다.
private static final int[] MAX_DAYS = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public int getMaxDaysOfMonth(int month) {
return MAX_DAYS[month -1];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Calendar cal = new Calendar();
System.out.println("궁금하신 월을 입력하세요");
int month = sc.nextInt();
if (month >0 && month <13) {
System.out.printf("%d월은 %d까지 입니다.\n",month, days.getMaxDaysOfMonth(month) );
} else {System.out.println("1~12까지의 숫자를 입력하시오");
}
}
}
public static void main(String[] args) {
String prompt = "cal> ";
Scanner scanner = new Scanner(System.in);
Calendar cal = new Calendar();
for (int i = 0; ; i++) {
System.out.println("월을 입력하세요:");
System.out.print(prompt);
int month = scanner.nextInt();
if(month == -1) {
System.out.println("Have a nice day!");
break;
} else if(month > 12) {
continue;
} else {
System.out.printf("%d월은 %d일 까지 입니다.\n",month,cal.getMaxDaysOfMonth(month));
System.out.println("");
}
}
System.out.println("bye~");
입력값앞에 print문을 사용하여 프롬프트를 만들고 for문안에 최대일수를 구하는 문장들을 넣어 여러번 반복하게 구현하였습니다. break문과 continue문을 활용하여 -1을 입력하면 반복을 중지하고 13이상의 값을 입력하면 다시 입력값을 받도록 구현하였습니다.
public class Calendar {
private static final int[] MaxDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
public static int getMaxDaysOfMonth(int month) {
return MaxDays[month - 1];
}
public static void printCalendar(int year, int month) {
System.out.printf(" <<%4d년%3d월>>\n", year, month);
System.out.println(" SU MO TU WE TU FR SA");
System.out.println("----------------------");
int maxDay = getMaxDaysOfMonth(month);
for (int i = 1; i <= maxDay; i++) {
System.out.printf("%3d", i);
if (i % 7 == 0) {
System.out.println();
}
}
System.out.println();
}
}
import java.util.Scanner;
public class Prompt {
private final static String PROMPT = "cal> ";
public void runPrompt() {
Scanner scanner = new Scanner(System.in);
Calendar cal = new Calendar();
for (int i = 0;; i++) {
System.out.println("달을 입력하세요:");
System.out.print(PROMPT);
int month = scanner.nextInt();
if (month == -1) {
System.out.println("Have a nice day!");
break;
} else if (month > 12) {
continue;
} else {
cal.printCalendar(2020, month);;
System.out.println("");
}
}
System.out.println("bye~");
scanner.close();
}
public static void main(String[] args) {
// 셀 실행
Prompt p = new Prompt();
p.runPrompt();
}
}
Calendar 클래스의 복잡성을 줄여주기 위해 입력받는 부분을 Prompt 클래스로 옮겨주고 달력을 작성하는 부분을 Calendar 클래스에 작성합니다. Calendar에서 반복문을 통해 각 월별 최대일수 만큼 숫자를 출력하게하고 그안의 조건문을 두어 7번째마다 줄바꿈을 할 수 있게하여 달력형식을 만들었습니다.
public class Calendar {
private static final int[] MaxDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
private static final int[] LeapMaxDays = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
public static boolean isLeapYear(int year) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
return true;
else
return false;
}
public static int getMaxDaysOfMonth(int year, int month) {
if(isLeapYear(year))
return LeapMaxDays[month-1];
else
return MaxDays[month - 1];
}
public static void printCalendar(int year, int month) {
System.out.printf(" <<%4d년%3d월>>\n", year, month);
System.out.println(" SU MO TU WE TU FR SA");
System.out.println("----------------------");
int maxDay = getMaxDaysOfMonth(year, month);
for (int i = 1; i <= maxDay; i++) {
System.out.printf("%3d", i);
if (i % 7 == 0) {
System.out.println();
}
}
}
}
}
public class Prompt {
private final static String PROMPT = "cal> ";
public void runPrompt() {
Scanner scanner = new Scanner(System.in);
Calendar cal = new Calendar();
int month = 0;
int year = 0;
for (int i = 0;; i++) {
System.out.println("연도를 입력하세요:");
System.out.print(PROMPT);
year = scanner.nextInt();
System.out.println("달을 입력하세요:");
System.out.print(PROMPT);
month = scanner.nextInt();
if (month == -1) {
System.out.println("Have a nice day!");
break;
} else if (month > 12) {
continue;
} else {
cal.printCalendar(year, month);;
System.out.println("");
}
}
System.out.println("bye~");
scanner.close();
}
public static void main(String[] args) {
// 셀 실행
Prompt p = new Prompt();
p.runPrompt();
}
}
Calendar 클래스에 윤년일때 월별 최대일수로 사용할 LeapMaxDays 배열을 추가하고 윤년조건 체크할 isLeapYear 메소드를 추가하였습니다. 그 후 getMaxDaysOfMonth 메소드에서 입력받은 연도가 윤년인지 여부에 따라 무슨 배열을 사용할지를 선택하게 한후 그 배열을 기존의 반복문에 사용함으로 윤년이 반영될 수 있게 하였습니다. 그 후 연과 월을 같이 입력받을 수 있도록 Prompt 클래스에 입력문을 추가하였습니다.
결과값)
연도를 입력하세요:
cal> 2020
달을 입력하세요:
cal> 2
<<2020년 2월>>
SU MO TU WE TU FR SA
----------------------
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29
이렇게 해서 연도와 월을 입력해서 기본적인 달력을 추가하는 예제를 구현해보았습니다. 캘린더 만들기2에서 아직 미비한 부분을 보충해서 만들도록 하겠습니다.