캘린더2
오늘은 코로나에 걸려서 컨디션도 매우 안좋은데다가 강의 내용이 어렵기까지 해서 증말 포기하고 싶었다. 원하는 결과물을 얻기 위해서 쉬운 난이도부터 어려운 난이도까지 있었는데 어려운 난이도 도전하다가 잘안되니까 멘탈이 깨져 쉬운 난이도를 도전도 안해보고 놔버릴 뻔했었다. 근데 일단 하고 나니까 그래도 100% 성취는 못했지만 70%라도 성취를 했으니 다행이다. 포기했으면 0이였을 테니까.. 이 쪽 일을 하려면 이러한 상황들을 견딜 수 있는 근육을 계속 길러나가야 겠다는 생각이 종종 든다. 난 아직 시련을 견디기에는 많이 약한 듯하다.. 별거 아닌걸로 멘탈이 흔들리니 말이다. 어쨋든 Today I Learned을 시작한다.
1. 입력 받은 월의 최대 일수 출력
import java.util.Scanner;
public class calendar {
public static void main(String[] args) {
System.out.println("월 입력 : ");
Scanner scanner = new Scanner(System.in);
int month = scanner.nextInt();
// 월별 최대 일수 배열로 정리
int[] maxDays = {31,28,31,30,31,30,31,31,30,31,30,31};
System.out.printf("%d월의 일수는 %d일이다.\n",month, maxDays[month - 1]);
}
}
(1) maxDays
강의에서는 위 코드대로 월별 최대일수를 배열로 묶어서 특정월을 입력받았을 때 배열에서 뽑아다 출력하는 형태로 코드를 짰다. 난 처음에 강의를 보기 전에 31일인 월, 30일인 월, 28일인 월 세 개의 배열로 나눴다. 그 다음 if문을 사용하여 입력 받은 월이 31일 배열에 포함되면 최대일수 31일을 출력해 내는 형태로 코드를 짜고 싶었다.
int[] thirtyOne = {1,3,5,7,8,10,12};
int[] thirty = {4,6,9,11};
int[] twentyEight = {2};
if () {} .....
근데 입력받은 월이 세개의 배열중 어디에 속하는지에 대한 함수를 몰라서 결국 해내지 못했다. 배열에 특정값이 존재하는 지 알 수 있는 함수가 contains()인지 뭔지 구글링으로 알아내긴 했는데 정확한 문법은 잘 모르겠다..
(2) 두번째 sol)
import java.util.Calendar;
import java.util.Scanner;
public class calendar {
private 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 static void main(String[] args) {
System.out.println("월 입력 : ");
Scanner scanner = new Scanner(System.in);
Calendar calendar = new Calendar();
int month = scanner.nextInt();
System.out.printf("%d월의 일수는 %d일이다.\n",month, maxsDaysOfMonth(month));
}
}
여기서부터 뭔가가 잘못되었다. 위 코드에서 배열을 함수로 빼는 과정에서 뭔가 오류가 계속 생겼다. 그리고 Calendar calendar = new Calendar(); 이 코드가 자꾸 에러가 나는데 왜인지 도저히 모르겠다.. 에러는 'Calendar' is abstract; cannot be instantiated 이렇게 뜬다.. 이후의 강의들이 다 이거로부터 연결되는 내용인데 여기서 포기할까 싶었다. 기본적인 문법도 모르는데다가 강의는 너무 오래 전 내용이고, 에디터도 다른 걸 쓰고 있어서 차라리 이 강의 포기하고 생활코딩이나 다른 기본부터 배울 수 있는 강의를 찾아봐야겠다고 거의 확정짓고 있었는데.. 그래도 칼뽑았으니까 대충 뭐라도 썰고 넘어가자라는 생각하면서 그냥 쭉 이어서 하려고 한다.ㅠㅜ
2. 반복 입력 가능하도록 변경
import java.util.Scanner;
public class calendar {
public static void main(String[] args) {
System.out.println("입력 횟수 : ");
Scanner scanner = new Scanner(System.in);
int cnt = scanner.nextInt();
int[] maxDays = {31,28,31,30,31,30,31,31,30,31,30,31};
for (int i=0; i<cnt; i++) {
System.out.println("달을 입력하세요.");
int month = scanner.nextInt();
System.out.printf("%d월의 일수는 %d일이다.\n",month, maxDays[month - 1]);
}
}
}
(1) for문
for문을 이용하여 입력 횟수를 받아 입력 횟수만큼 달을 입력할 수 있게끔해서 출력을 하는 코드이다. 반복문에서 보통 횟수가 정해져 있을 때엔 for문을 쓰고, 횟수가 정해져 있지 않다면 while문을 쓴다.
3. 종료 조건을 이용해 반복
// 1. 종료 조건을 만듦 -> if문 사용
// 2. prompt 만들기
import java.util.Scanner;
public class calendar {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] maxDays = {31,28,31,30,31,30,31,31,30,31,30,31};
String PROMPT = "CAL> ";
while (true) {
System.out.println("달을 입력하세요.");
System.out.print(PROMPT);
int month = scanner.nextInt();
if (month < 1) {
System.out.println("Bye");
break;
}
else if (month > 12) {
continue;
}
System.out.printf("%d 월의 일수는 %d 일이다.",month, maxDays[month - 1]);
}
}
}
(1) PROMPT
문자형 변수 PROMPT를 생성해서 실제 프롬프트창 커서처럼 "cal> "을 적었다.
(2) while문
입력 횟수가 정해져 있지 않으므로 while문 조건을 true로 해놓고 종료조건을 만족하지 않는 이상 무한으로 입력을 받도록 코드를 짰다.
(3) break, continue;
break는 if문의 조건을 만족할 시 코드를 종료시키는 역할을 하고, continue는 계속 진행하도록 하는 역할을 한다. 여기서는 1보다 작은 수로 입력을 받을 시 while문을 탈출하도록 했고, 12보다 큰 수를 입력받을 시 계속 입력을 받도록 했다.
(4) if문
여기서는 if문의 위치가 나름 중요하다. 위치에 따라 에러가 나기도 하고 정상적으로 작동하기도 한다. System.out.printf("%d 월의 일수는 %d 일이다.",month, maxDays[month - 1]); 이 코드보다 if 문이 아래에 있게되면 month가 0 이하나 13 이상을 입력값으로 받게 되면 maxDays의 크기는 12이기 때문에 에러가 나게 된다.
Author And Source
이 문제에 관하여(캘린더2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@k_siik/캘린더2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)