/ TRAINING

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>

[알게 된 점]

   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문의 맨 처음으로