Calender 1
실습
0. 목차
1. 달력구현
2. 두 수의 합 출력
3. 입력받은 월의 일수 출력
4. 반복입력 프로그램 설정
5. 종료 조건을 이용해 반복하기
1. 달력구현
▶ Mission.
▷ 아래 내용을 그대로 출력하는 프로그램을 작성해 본다.
일 월 화 수 목 금 토
--------------------
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
▶ 혼자 Mission 해보기 - 1
package baek.calender;
public class Calender {
public static void main(String[] args) {
System.out.println("일 월 화 수 목 금 토");
System.out.println("---------------------");
System.out.println(" 1 2 3 4 5 6 7");
System.out.println(" 8 9 10 11 12 13 14");
System.out.println("15 16 17 18 19 20 21");
System.out.println("22 23 24 25 26 27 28");
System.out.println("29 30 31");
}
}
일 월 화 수 목 금 토
---------------------
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 30 31
간격이 맞지 않음
콘솔로 볼 때는 맞지 않았는데 블로그에 올리니 간격 맞음
▶ 혼자 Mission 해보기 - 2
▷ 간격을 아예 넓혀서 코딩
package baek.calender;
public class Calender {
public static void main(String[] args) {
System.out.println("일 월 화 수 목 금 토");
System.out.println("---------------------------------------------------");
System.out.println("1 2 3 4 5 6 7");
System.out.println("8 9 10 11 12 13 14");
System.out.println("15 16 17 18 19 20 21");
System.out.println("22 23 24 25 26 27 28");
System.out.println("29 30 31");
}
}
일 월 화 수 목 금 토
---------------------------------------------------
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 30 31
- 자동정렬
Ctrl + Shift + F
2. 두 수의 합 출력 - scanner 활용
▶ Mission.
▷ 키보드로 입력받은 두 숫자의 합을 구한다.
두 수를 입력하세요.
5 10 (엔터)
두 수의 합은 15입니다.
▶ 혼자 Mission 해보기
package baek.calender;
import java.util.Scanner;
public class Calender {
public static void main(String[] args) {
System.out.println("두 수를 입력하세요.");
Scanner scanner = new Scanner(System.in);
String inputValue = scanner.nextLine();
String[] splitedValue = inputValue.split(" ");
int first = Integer.parseInt(splitedValue[0]);
int second = Integer.parseInt(splitedValue[1]);
System.out.println("두 수의 합은 " + (first + second) + " 입니다.");
}
}
두 수를 입력하세요.
5 10
두 수의 합은 15 입니다.
▶ 해설 보고 Mission 해보기
package baek.calender;
import java.util.Scanner;
public class Sum {
public static void main(String[] args) {
//입력
int a, b;
Scanner scanner = new Scanner(System.in);
String s1, s2;
System.out.println("두 수를 입력하세요.");
s1 = scanner.next();
s2 = scanner.next();
a = Integer.parseInt(s1);
b = Integer.parseInt(s2);
//출력
System.out.printf("두 수의 합은 %d 입니다.", a + b);
scanner.close();
}
}
두 수를 입력하세요.
5 10
두 수의 합은 15 입니다.
- 자동 import
Ctrl + Shift + M
[알게 된 점]
1. System.in
키보드로 입력을 받겠다
2. scanner.next
키보드로 입력받는 값 = scanner.next = String
1) s1, s2 = String 타입 변수 → s1, s2를 이용하여 키보드로 입력한 값을 담음
2) s1, s2 → int a, b에 담음
a = Integer.parseInt(s1);
b = Integer.parseInt(s2);
3. Integer
Integer는 정수형 클래스
int ≠ Integer
4. printf 이용하기
a = 1, b = 2 일 때
system.out.printf(“두 수의 합은 %d”, a + b); = 두 수의 합은 3
system.out.printf(“%d와 %d의 합은 %d”, a, b, a + b); = 1와 2의 합은 3
5. scanner.close();
다 썼으면 문 닫아줘야 경고안남
3. 입력받은 월의 일수 출력 - 배열 활용
▶ Mission.
▷ 달 입력 시 그 달의 일수를 출력하는 프로그램 작성하기
달을 입력하세요.
3 (엔터)
3월은 31일까지 있습니다.
▶ 혼자 Mission 해보기 - 1
package baek.calender;
import java.util.Scanner;
public class Calender {
public static void main(String[] args) {
System.out.println("달을 입력하세요.");
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int[] b = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
System.out.println(b[a]);
}
}
달을 입력하세요.
3
30
▶ 해설 보고 Mission 해보기 - 1
▷ 변수명, 배열
package baek.calender;
import java.util.Scanner;
public class Calender {
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]);
}
}
달을 입력하세요.
3
3월은 31일까지 있습니다.
[알게 된 점]
1. 배열에서 마이너스 쓰기 가능
배열에는 0이 있기 때문에 입력한 달에서 -1을 해 주어야 날짜가 맞음
2. 변수명은 무엇을 하는 변수인지 알기쉽게!
혼자 했을 때는 a, b라고 변수명을 만들었음
달 입력을 받는 변수는 month
최대 일수를 나타내는 변수는 maxDays
라고 해 주니 가시성 up
3. \n
printf로 할 때 줄바꿈 키 : \n
▶ 해설 보고 Mission 해보기 - 2
▷ 메서드, 배열
package baek.calender;
import java.util.Scanner;
public class Calendar {
public static final int[] maxDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public int maxDaysOfMonth(int month) {
return maxDays[month - 1];
}
public static void main(String[] args) {
System.out.println("달을 입력하세요.");
Scanner scanner = new Scanner(System.in);
Calender cal = new Calender();
int month = scanner.nextInt();
System.out.printf("%d월은 %d일까지 있습니다. \n", month, cal.maxDaysOfMonth(month));
}
}
달을 입력하세요.
3
3월은 31일까지 있습니다.
[알게 된 점]
1. static과 final
- static
메모리에 한번 입력된 건 그걸로 계속 씀
A가 10을 입력했는데 좀 있다 B도 10입력
A가 입력한 10, B가 입력한 10 이렇게 따로 저장 안함
A가 입력했을 때 10 잘 보관
B가 또 10 입력하면 또 새로운 10 저장하는게 아니라 있는 10 씀
메모리 낭비안함- final
한번 한 결정이 최종결정
번복이란 없는 노빠꾸 친구- static과 final
죽이 잘 맞는 친구
예를들어 A는 10을 입력하기도 하고 마음 변하면 20을 입력하기도 함
그럼 static은 장단맞춰 10 저장 20도 저장
근데 final A가 10 입력했다?
그럼 A랑 10은 그냥 결혼한거임 주구장창 10만 입력
static은 처음 입력해 둔 10만 꺼내주면 됨
그래서 static과 final은 찰떡궁합- maxDays는?
public static final int[] maxDays
배열에 넣어두고 애초에 설정해 둔대로 딱 부르는 수만 나와라!
참고
2. maxDaysOfMonth 메서드를 사용하기 위해서는?
maxDaysOfMonth가 있는 Calender 클래스를 쓸 수 있게 만들어 줌
Calender cal = new Calender(); 이걸 해 주고
cal.maxDaysOfMonth()를 해 주면 불러서 쓸 수 있음
▶ 해설 보고 Mission 해보기 - 3
▷ if문
package baek.calender;
import java.util.Scanner;
public class Calender {
int month;
public static final int[] maxDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public int maxDaysOfMonth(int month) {
if(month == 2) {
return 28;
} else if(month == 4) {
return 30;
} else if(month == 6) {
return 30;
} else if(month == 9) {
return 30;
} else if(month == 11) {
return 30;
} else {
return 31;
}
}
public static void main(String[] args) {
System.out.println("달을 입력하세요.");
Scanner scanner = new Scanner(System.in);
Calender cal = new Calender();
int month = scanner.nextInt();
System.out.printf("%d월은 %d일까지 있습니다. \n", month, cal.maxDaysOfMonth(month));
}
}
달을 입력하세요.
3
3월은 31일까지 있습니다.
if문 보단 배열이 낫다
▶ 해설 보고 Mission 해보기 - 4
▷ switch
package baek.calender;
import java.util.Scanner;
public class Calender {
int month;
public static final int[] maxDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public int maxDaysOfMonth(int month) {
switch(month) {
case 2 :
return 28;
case 4 :
return 30;
case 6 :
return 30;
case 9 :
return 30;
case 11 :
return 30;
default :
return 31;
}
}
public static void main(String[] args) {
System.out.println("달을 입력하세요.");
Scanner scanner = new Scanner(System.in);
Calender cal = new Calender();
int month = scanner.nextInt();
System.out.printf("%d월은 %d일까지 있습니다. \n", month, cal.maxDaysOfMonth(month));
}
}
달을 입력하세요.
3
3월은 31일까지 있습니다.
switch 보단 배열이 낫다
▶ 혼자 응용 해보기
▷ 달력도 나오게 해 보기
package baek.calender;
import java.util.Scanner;
public class Calender {
int month;
public static final int[] maxDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public int maxDaysOfMonth(int month) {
return maxDays[month - 1];
}
public void printCalender(int month) {
String b = "";
String i = "31";
String j = "30 ";
String t = "29 ";
String k = " 28";
if(month == 1) {
b = t + j + i;
} else if(month == 2) {
b = "";
} else if(month == 3) {
b = t + j + i;
} else if(month == 5) {
b = t + j + i;
} else if(month == 7) {
b = t + j + i;
} else if(month == 8) {
b = t + j + i;
} else if(month == 10) {
b = t + j + i;
} else {
b = t + j;
}
System.out.printf("\n2021년 %d월\n", month);
System.out.println("일 월 화 수 목 금 토");
System.out.println("---------------------");
System.out.println(" 1 2 3 4 5 6 7");
System.out.println(" 8 9 10 11 12 13 14");
System.out.println("15 16 17 18 19 20 21");
System.out.println("22 23 24 25 26 27" + k);
System.out.println(b);
}
public static void main(String[] args) {
System.out.println("달을 입력하세요.");
Scanner scanner = new Scanner(System.in);
Calender cal = new Calender();
int month = scanner.nextInt();
System.out.printf("%d월은 %d일까지 있습니다. \n", month, cal.maxDaysOfMonth(month));
cal.printCalender(month);
}
}
달을 입력하세요.
2
2월은 28일까지 있습니다.
2021년 2월
일 월 화 수 목 금 토
---------------------
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
4. 반복입력 프로그램 설정 - 반복문 활용
▶ Mission.
▷ 달 입력 시 그 달의 일수를 출력하는 프로그램 작성하기
▷ 입력한 만큼 반복가능
반복횟수를 입력하세요.
3 (엔터)
월을 입력하세요.
1
2
3
1월은 31일까지 있습니다.
2월은 28일까지 있습니다.
3월은 31일까지 있습니다.
▶ 혼자 Mission 해보기
package baek.calender;
import java.util.Scanner;
public class Calender {
int month;
public static final int[] maxDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public int maxDaysOfMonth(int month) {
return maxDays[month - 1];
}
public static void main(String[] args) {
System.out.printf("반복 횟수를 입력하세요. \n");
Scanner scanner = new Scanner(System.in);
Calender cal = new Calender();
int month = scanner.nextInt();
System.out.printf("\n월을 입력하세요.\n");
for(int j = 1; j < month + 1; j++) {
System.out.println(j);
}
for(int i = 1; i < month + 1; i++) {
System.out.printf("\n%d월은 %d일까지 있습니다.", i, cal.maxDaysOfMonth(i));
}
scanner.close();
}
}
반복 횟수를 입력하세요.
3
월을 입력하세요.
1
2
3
1월은 31일까지 있습니다.
2월은 28일까지 있습니다.
3월은 31일까지 있습니다.
▶ 해설보고 Mission 해보기
package baek.calender;
import java.util.Scanner;
public class Calender {
int month;
public static final int[] maxDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public int maxDaysOfMonth(int month) {
return maxDays[month - 1];
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Calender cal = new Calender();
System.out.printf("반복 횟수를 입력하세요. \n");
int repeat = scanner.nextInt();
for(int i = 0; i < repeat; i++) {
System.out.printf("\n월을 입력하세요.\n");
int month = scanner.nextInt();
System.out.printf("\n%d월은 %d일까지 있습니다.\n", month, cal.maxDaysOfMonth(month));
}
System.out.println("repeat 종료");
scanner.close();
}
}
반복 횟수를 입력하세요.
3
월을 입력하세요.
1
1월은 31일까지 있습니다.
월을 입력하세요.
2
2월은 28일까지 있습니다.
월을 입력하세요.
3
3월은 31일까지 있습니다.
repeat 종료
[알게 된 점]
for과 while
- for
반복되는 횟수가 정해져 있을 때 쓰면 좋음- while
반복되는 횟수가 정해져 있지 않을 때 쓰면 좋음
5. 종료 조건을 이용해 반복하기
▶ Mission.
▷ 전 단계와 비슷하게 반복입력을 받을 수 있게 구현한다.
▷ 입력하는 곳 앞에 프롬프트를 출력한다.
▷ -1일 입력받을 경우 프로그램을 종료한다.
월을 입력하세요.
> 3
3월은 31일까지 있습니다.
월을 입력하세요.
> 2
2월은 28일까지 있습니다.
월을 입력하세요.
> -1
Have a nice day!
▶ 혼자 Mission 해보기
package baek.calender;
import java.util.Scanner;
public class Calender {
int month;
public static final int[] maxDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public int maxDaysOfMonth(int month) {
return maxDays[month - 1];
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Calender cal = new Calender();
for(int i = 0; i < 12; i++) {
System.out.printf("월을 입력하세요.\n> ");
int month = scanner.nextInt();
System.out.printf("%d월은 %d일까지 있습니다.\n\n", month, cal.maxDaysOfMonth(month));
}
scanner.close();
}
}
월을 입력하세요.
> 3
3월은 31일까지 있습니다.
월을 입력하세요.
> 2
2월은 28일까지 있습니다.
월을 입력하세요.
> 1
1월은 31일까지 있습니다.
월을 입력하세요.
>
▶ 해설보고 Mission 해보기 - 1
▷ 프롬프트 넣기
package baek.calender;
import java.util.Scanner;
public class Calender {
int month;
public static final int[] maxDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public int maxDaysOfMonth(int month) {
return maxDays[month - 1];
}
public static void main(String[] args) {
String PROMPT = "cal> ";
Scanner scanner = new Scanner(System.in);
Calender cal = new Calender();
for(int i = 0; i < 12; i++) {
System.out.printf("월을 입력하세요.\n");
System.out.print(PROMPT);
int month = scanner.nextInt();
System.out.printf("%d월은 %d일까지 있습니다.\n\n", month, cal.maxDaysOfMonth(month));
}
scanner.close();
}
}
월을 입력하세요.
cal> 3
3월은 31일까지 있습니다.
월을 입력하세요.
cal> 4
4월은 30일까지 있습니다.
월을 입력하세요.
cal> 11
11월은 30일까지 있습니다.
월을 입력하세요.
cal> 12
12월은 31일까지 있습니다.
월을 입력하세요.
cal>
[알게 된 점]
print / println / printf 차이?
package baek.calender; public class PlayGround { public static void main(String[] args) { System.out.print("프린트 print"); System.out.print("프린트 print"); System.out.printf("프린트에프 printf"); System.out.printf("프린트에프 printf"); System.out.println("프린트엘엔 println"); System.out.println("프린트엘엔 println"); } }
프린트 print프린트 print프린트에프 printf프린트에프 printf프린트엘엔 println 프린트엘엔 println
println만 개행
package baek.calender; public class PlayGround { public static void main(String[] args) { System.out.print("프린트 print\n"); System.out.print("프린트 print\n"); System.out.printf("프린트에프 printf\n"); System.out.printf("프린트에프 printf\n"); System.out.println("프린트엘엔 println"); System.out.println("프린트엘엔 println"); } }
프린트 print 프린트 print 프린트에프 printf 프린트에프 printf 프린트엘엔 println 프린트엘엔 println
print 개행 :\n
printf 개행 :\n
println 개행:자동package baek.calender; public class PlayGround { public static void main(String[] args) { int a = 100; System.out.print("프린트 print\n %d, a"); System.out.print("프린트 print\n %d, a"); System.out.printf("프린트에프 printf\n %d", a); System.out.printf("프린트에프 printf\n %d", a); System.out.println("프린트엘엔 println %d, a"); System.out.println("프린트엘엔 println %d, a"); } }
프린트 print %d, a프린트 print %d, a프린트에프 printf 100프린트에프 printf 100프린트엘엔 println %d, a 프린트엘엔 println %d, a
printf만 %d가 적용
package baek.calender; public class PlayGround { public static void main(String[] args) { int a = 100; System.out.print("프린트 print" + a + "\n"); System.out.print("프린트 print" + a + "\n"); System.out.printf("프린트에프 printf %d\n", a); System.out.printf("프린트에프 printf %d\n", a); System.out.println("프린트엘엔 println" + a); System.out.println("프린트엘엔 println" + a); } }
프린트 print100 프린트 print100 프린트에프 printf 100 프린트에프 printf 100 프린트엘엔 println100 프린트엘엔 println100
print / printf / printf는 계속하면서 적절한 게 무엇인지 파악
▶ 해설보고 Mission 해보기 - 2
▷ while문, if문 사용
package baek.calender;
import java.util.Scanner;
public class Calender {
public static final int[] maxDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public int maxDaysOfMonth(int month) {
return maxDays[month - 1];
}
public static void main(String[] args) {
String PROMPT = "cal> ";
Scanner scanner = new Scanner(System.in);
Calender cal = new Calender();
while(true) {
System.out.printf("월을 입력하세요.\n");
System.out.print(PROMPT);
int month = scanner.nextInt();
if(month == -1) {
break;
}
if(month > 12) {
continue;
}
System.out.printf("%d월은 %d일까지 있습니다.\n\n", month, cal.maxDaysOfMonth(month));
}
System.out.println("Have a nice day!");
scanner.close();
}
}
월을 입력하세요.
cal> 13
월을 입력하세요.
cal> 12
12월은 31일까지 있습니다.
월을 입력하세요.
cal> 11
11월은 30일까지 있습니다.
월을 입력하세요.
cal> 10
10월은 31일까지 있습니다.
월을 입력하세요.
cal> 9
9월은 30일까지 있습니다.
월을 입력하세요.
cal> -1
Have a nice day!
[알게 된 점]
1. while(true)
while문 무한루프로 돌기
2. if(month == -1) → break
-1치면 while문 빠져나오기
3. if(month > 12) → continue
12이상으로 치면 while문의 맨 처음으로