Java로 Calendar 만들기 (1)

Jane·2020년 12월 3일
3
post-thumbnail

이 글은 만들어 가면서 배우는 JAVA 플레이그라운드를 수강하고 공부한 내용을 정리하는 용도로 작성되었습니다. 미션 조건을 보고 직접 구현하였기에 호눅스의 코드와는 다른 점이 있으며, 호눅스의 코드를 확인하고 싶으신 분들은 본 포스팅이 아닌 codesquad-java-calendar를 확인해주세요🙂

Simple Calendar


년도, 출력하고 싶은 달력의 수, 월, 1일이 시작하는 날짜를 입력 시 윤년을 고려하여 달력을 출력하는 프로그램

구현 방법

package janeljs.calendar;

import java.util.HashMap;

public class Calendar {
	public static final int[] LAST_DAYS = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	public static final int[] LEAP_YEAR_LAST_DAYS = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

우선 각 월의 마지막 날을 담은 배열을 final로 선언해주었다. 처음에는 if문을 활용해서 짝수달, 홀수 달을 나누고 세부 조건 설정을 통해 마지막 날을 구했지만, 7월과 8월 모두 31일이라 중간부터는 짝홀이 뒤바뀌기도 하고, 윤년 또한 고려해줘야 하기 때문에 아예 데이터값이 변하지 않는 배열에 마지막 날을 저장했다.

	public static void printCalendar(int year, int month, String firstDay) {
		int count = 0;
		System.out.printf("     <<%4d년 %d월>>\n", year, month);
		System.out.println(" SU MO TU WE TH FR SA");
		System.out.println(" --------------------");
		HashMap<String, Integer> day = new HashMap<>();
		day.put("SU", 0);
		day.put("MO", 1);
		day.put("TU", 2);
		day.put("WE", 3);
		day.put("TH", 4);
		day.put("FR", 5);
		day.put("SA", 6);
		
		for (int i=0; i< day.get(firstDay); i++) {
			System.out.print("   ");
			count++;
		}

		int lastDay = getLastDay(year, month);
		for (int i = 1; i <= lastDay; i++) {
			System.out.printf("%3d", i);
			count++;
			if (count%7==0) {
				System.out.println();
			}
		}
		System.out.println();
		System.out.println();
	}

printCalendar 메서드를 정의하여 달력을 출력했다. 사용자가 입력한 요일부터 1일이 시작하도록 달력을 만들기 위해 HashMap을 사용했는데, 굳이 HashMap에 저장하지 않고 if~else문이나 switch~case를 이용해서 구현해도 된다. 나는 조금 더 간결해보이는 코드를 위해 HashMap을 사용했다.

	public static int getLastDay(int year, int month) {
		int lastday = 0;
		if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) {
			lastday = LEAP_YEAR_LAST_DAYS[month - 1];
		} else {
			lastday = LAST_DAYS[month - 1];
		}

		return lastday;
	}
}

코드가 너무 길어져서 마지막 날을 구하는 메서드는 따로 정의했다. 윤년에 대한 조건을 설정하여 처음 선언했던 final 배열에서 값을 받아오면 된다.

package janeljs.calendar;

import java.util.Scanner;

public class Prompt {

	public void runPrompt() {
		Scanner sc = new Scanner(System.in);
		System.out.println("📆 Please enter the year.");
		System.out.print("YEAR> ");
		int year = sc.nextInt();
		System.out.println("🔢 Please enter the number of calendars you want to print.");
		System.out.print("NUMBER> ");
		int N = sc.nextInt();
		int[] monthArr = new int[N];
		int[] lastdayArr = new int[N];
		System.out.println("🈷 Please enter a month.");

		for (int i = 0; i < N; i++) {
			System.out.print("MONTH> ");
			monthArr[i] = sc.nextInt();
			String blank = sc.nextLine();
			System.out.println("💖 Please enter the first day of the month. (SU, MO, TU, WE, TH, FR, SA)");
			System.out.print("DAY> ");
			String firstDay = sc.nextLine();

			System.out.println(firstDay);

			if (monthArr[i] > 12) {
				System.out.println("❗ 유효한 값이 아닙니다.");
				monthArr[i] = sc.nextInt();
			}
			if (monthArr[i] == -1) {
				System.out.println("Bye~");
				break;
			}
			lastdayArr[i] = Calendar.getLastDay(year, monthArr[i]);
			Calendar.printCalendar(year, monthArr[i], firstDay);

		}
		System.out.println();
		for (int i = 0; i < N; i++) {
			if (monthArr[i] == -1) {
				break;
			}
			System.out.printf("%d월은 %d일까지 있습니다.\n", monthArr[i], lastdayArr[i]);

		}

		sc.close();
	}

	public static void main(String[] args) {

		Prompt prompt = new Prompt();
		prompt.runPrompt();

	}

}

처음에 String firstDay = sc.nextLine();를 실행했더니 String input값을 입력할 수 없었다. 구글링해보니 nextInt() 메서드를 호출한 뒤에 cursor가 계속 int를 받아온 줄에 머물러 있기 때문에 발생하는 오류였다.

이를 해결하기 위해서는 두 가지 방법이 있다.

  1. nextInt() 대신 nextLine()으로 모든 input을 받아오고, 정수로 변환해야 할 때는 Integer.parseInt()를 이용하면 된다.
int var = Integer.parseInt(sc.nextLine());
  1. sc.nextLine();를 사용해서 공백인 줄을 없애버리고 다음 nextLine()으로 받아온 값을 내가 원하는 변수에 저장하면 된다.

두 번째 방법을 활용해서 String blank = sc.nextLine();String firstDay = sc.nextLine(); 전에 선언해 주었더니 의도한 대로 잘 작동하였다.

3개의 댓글

comment-user-thumbnail
2022년 7월 12일

안녕하세요 인프런에서 java 플레이그라운드 강의를 들으면서 코드스쿼드 마스터즈 코스를 준비하고 있다가 우연히 알게되서 질문 드리고 싶은게 생겨 댓글을 남겨보아용..마스터즈 코스 들어가기 위해서 어떻게 공부하셨는지 여쭤봐도 될까요? 테스트 난이도가 높다고 하던데 코테 준비와 면접 준비는 어떻게 하셨는지도 귱금합니당..시간 되실 때 댓글 남겨주심 감사하겠습니다ㅠ

1개의 답글