난이도가 점점 올라가고 있어서 재미있기도 하고 두통이 오기도 한다. 앞으로도 재미를 잃지 않았음 좋겠다.. 어쨋든 Today I learned 시작한다.
Public class Calendar {
public static final int[] MAX_DAYS = {31,28,31,30,31,30,31,31,30,31,30,31};
public int maxDaysOfMonth(int month) {
return MAX_DAYS[month - 1]
}
public void printCalendar(int month) {
System.out.println("\t일\t월\t화\t수\t목\t금\t토");
System.out.println("\t--------------------------");
System.out.println("\t1\t2\t3\t4\t5\t6\t7");
System.out.println("\t8\t9\t10\t11\t12\t13\t14");
System.out.println("\t15\t16\t17\t18\t19\t20\t21");
System.out.println("\t22\t23\t24\t25\t26\t27\t28");
}
}
import java.util.Scanner;
Public class Prompt {
public void runPrompt {
Scanner scanner = new Scanner(System.in);
Calendar cal = new Calendar();
while (true) {
System.out.println("월을 입력하세요.");
System.out.println("month> ");
int month = scanner.nextInt();
if (month == -1) {
System.out.println("Bye");
break;
}
cal.printCalendar(month);
}
}
public static void main(String[] args) {
Prompt p = new Prompt();
p.runPrompt();
}
}
Calendar 파일의 main함수 코드를 긁어다가 Prompt라는 새 파일을 만든 후 붙여넣기를 했다. 파일 크기를 줄이고, 코드를 읽기 쉽게 하기 위함이다.
main 합수에 포함되어있던 로직들을 바깥으로 빼서 함수로 만드는 과정들이 꽤 많았는데 아직 무슨 말인지 잘 모르겠다. 특히 함수 앞에 쓰이는 public, static, void, final 이런 것들 때문에 더 헷갈린다. 어서 이 강의를 끝마치고 문법공부를 해야 할 것 같다.
이 의미를 잘 모르겠다. Calendar 라는 클래스를 Prompt파일에서 쓰겠다는 의미로 받아들였는데 그말이 맞는지 모르겠다.
이것 역시 3번과 유사하다. 근데 여기서 궁금한건 Prompt 파일내에서 이 코드를 왜 쓰는지 알 수가 없다. 굳이 runPrompt라는 함수를 왜 만들었는지 이해하지 못했지만 일단 진도를 따라갔다.
Public class Calendar {
public static final int[] MAX_DAYS = {31,28,31,30,31,30,31,31,30,31,30,31};
public static final int[] LEAP_MAX_DAYS = {31,29,31,30,31,30,31,31,30,31,30,31};
public int maxDaysOfMonth(int year, int month) {
// 윤년 계산
if (((year % 4 == 0) && (year % 100 !=0)) || (year % 400 == 0)) {
return LEAP_MAX_DAYS[month - 1];
}
else {
return MAX_DAYS[month - 1];
}
}
public void printCalendar(int year, int month) {
System.out.println("\t<<%3d년 %3d월>>");
System.out.println("\t일\t월\t화\t수\t목\t금\t토");
System.out.println("\t--------------------------");
int maxdays = maxDaysOfMonth(year, month);
for (int i=1; i<=maxDays; i++) {
System.out.printf("\t%d", i);
if (i % 7 == 0) {
System.out.println();
}
}
System.out.println();
System.out.println();
}
}
import java.util.Scanner;
Public class Prompt {
public void runPrompt {
Scanner scanner = new Scanner(System.in);
Calendar cal = new Calendar();
while (true) {
System.out.println("년을 입력하세요.");
System.out.println("year> ");
int year = scanner.nextInt();
System.out.println("월을 입력하세요.");
System.out.println("month> ");
int month = scanner.nextInt();
if (month == -1) {
System.out.println("Bye");
break;
}
cal.printCalendar(year, month);
}
}
public static void main(String[] args) {
Prompt p = new Prompt();
p.runPrompt();
}
}
i) 4로 나누어 떨어지면 윤년
ii) 4, 100으로 나누어 떨어지면 평년
iii) 4, 100, 400으로 나누어 떨어지면 윤년
윤년인 경우의 수만 생각해서 코드를 작성하였다.
((year % 4 == 0) && (year % 100 !=0)) || (year % 400 == 0)
4로 나누어 떨어지면서 100으로는 나누어 떨어지면 안되고, 400으로는 나누어떨어져도 되고 안나누어 떨어져도 된다.
순서
ㄱ) for 문으로 1부터 maxday까지 날짜 출력.
println을 사용하면 날짜마다 줄이 바뀌기 때문에 printf를 사용하고 \t을 해서 칸을 맞춘다.
ㄴ) 일렬인 날짜를 if문으로 7로 나누어 떨어질 때마다 줄바꿈.
아직까지는 1일을 일요일로 가정하고 있기 때문에 매 7일 마다 주가 바뀐다. 그러므로 if문을 사용해서 7로 나누어 떨어질때마다 println()으로 줄바꿈을 해준다.
import java.util.Scanner;
public class Prompt {
public int parseDay(String week) {
switch(week) {
default : return 0;
case "mo" : return 1;
case "tu" : return 2;
case "we" : return 3;
case "th" : return 4;
case "fr" : return 5;
case "sa" : return 6;
}
}
public void runPrompt() {
Scanner scanner = new Scanner(System.in);
Calendar cal = new Calendar(); // Calendar 클래스의 다른 method 도 가져다 쓸 수 있도록 하기 위함..?
while (true) {
System.out.println("년을 입력하세요.");
System.out.print("year> ");
int year = scanner.nextInt();
if (year <= 0) {
System.out.println("bye");
break;
}
System.out.println("월을 입력하세요.");
System.out.print("month> ");
int month = scanner.nextInt();
if (month <= 0 || month > 12) {
System.out.println("잘못 입력하셨습니다.(1 - 12)");
continue;
}
System.out.println("1일의 요일을 입력하세요.");
System.out.print("weekday> ");
String str_weekday = scanner.next();
int weekday = parseDay(str_weekday);
cal.printCalendar(year,month,weekday);
}
}
public static void main(String[] args) {
Prompt p = new Prompt();
p.runPrompt();
}
}
public class Calendar {
private static final int[] MAX_DAYS = {31,28,31,30,31,30,31,31,30,31,30,31};
private static final int[] LEAP_MAX_DAYS = {31,29,31,30,31,30,31,31,30,31,30,31};
public int maxDaysOfMonth(int year, int month) {
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
return LEAP_MAX_DAYS[month - 1];
}
else {
return MAX_DAYS[month - 1];
}
}
public void printCalendar(int year, int month, int weekday) {
System.out.printf("\t\t<<%4d년 %3d월>>\n",year, month);
System.out.println("\tSU\tMO\tTU\tWE\tTH\tFR\tSA");
System.out.println("\t--------------------------");
int maxDays = maxDaysOfMonth(year,month);
for (int k=0; k<weekday; k++) {
System.out.print("\t");
}
for (int j=1; j<=7-weekday; j++) {
System.out.printf("\t%d",j);
}
System.out.println();
for (int i=8-weekday; i<=maxDays; i++) {
System.out.printf("\t%d",i);
if (i % 7 == 7 - weekday) {
System.out.println();
}
}
System.out.println();
System.out.println();
}
}
해야할 순서를 정해보자.
ㄱ) 요일 문자형 입력 받기.
System.out.println("요일을 입력하세요.");
System.out.println("weekday> ");
String weekday = scanner.next();
ㄴ) 문자로 입력받은 요일을 정수형으로 바꾸기.
public int parseDay(String week) {
switch(week) {
case "mo" : return 1;
case "tu" : return 2;
case "we" : return 3;
case "th" : return 4;
case "fr" : return 5;
case "sa" : return 6;
default : return 0;
}
}
ㄷ) 첫째주만 따로 반복문 사용해서 (7-weekday)만큼 날짜 출력.
for (int f=1; j<=k-weekday; j++) {
System.out.printf("\t%d",j);
}
System.out.println();
ㄹ) for문 하나 더 사용 해서 0부터 weekday 전까지 print("\t")하기.
for (int k=0; k<weekday; k++) {
System.out.printf("\t");
}
ㅁ) 기존 for문을 1부터 시작하던걸 (8-weekday)부터로 바꾸기.
ㅂ) 현재는 7로 나누어 떨어질때마다 줄바꿈하던걸 (7-weekday)로 바꿈.
for (int i=8-weekday; i<=maxdays; i++) {
System.out.printf("\t%d",j);
if (i % 7 == 7-weekday) {
System.out.println();
}
}
System.out.println();