[Java] 캘린더 만들기 1

나영원·2020년 8월 24일
0

Java_basic

목록 보기
17/60

앞에서 배운 내용을 바탕으로 단계별로 캘린더 만들기를 해보겠습니다.

입력받은 달의 최대 일수 출력

import java.util.Scanner;

public class DaysA {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		System.out.println("궁금하신 월을 입력하세요");
		int input = sc.nextInt();

		int[] Maxdays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

		if (input >0 && input <13) {

		System.out.printf("%d월은 %d까지 입니다.",input,Maxdays[input-1]);

		} else {System.out.println("1~12까지의 숫자를 입력하시오");
		}

	}
	}

먼저 달을 입력받고 Maxdays라는 배열을 만들어 각 월별 최대일수를 저장해놓은 다음 조건문을 통해 각월에 맞는 최대일수를 출력합니다. Maxdays[input-1]인 이유는 입력값은 1~12이지만 배열은 0부터 시작하기에 그 차이를 맞추기 위해 입력값에 -1을 해준 것 입니다.

위의 내용을 메소드를 통해 정리하면 다음과 같습니다.

	private static final int[] MAX_DAYS = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

	public  int getMaxDaysOfMonth(int month) {
		return MAX_DAYS[month -1];
	}
	
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		Calendar cal = new Calendar();

		System.out.println("궁금하신 월을 입력하세요");
		int month = sc.nextInt();
        
		if (month >0 && month <13) {

		System.out.printf("%d월은 %d까지 입니다.\n",month, days.getMaxDaysOfMonth(month) );

		} else {System.out.println("1~12까지의 숫자를 입력하시오");

		}


	}
	}

반복해서 월별 최대일수를 출력해주기

public static void main(String[] args) {

		String prompt = "cal> ";
		Scanner scanner = new Scanner(System.in);
		Calendar cal = new Calendar();

		for (int i = 0; ; i++) {

		System.out.println("월을 입력하세요:");
		System.out.print(prompt);
		int month = scanner.nextInt();

		if(month == -1) {
			System.out.println("Have a nice day!");
			break;
		} else if(month > 12) {
			continue;
		} else {

		System.out.printf("%d월은 %d일 까지 입니다.\n",month,cal.getMaxDaysOfMonth(month));

		System.out.println("");
			}
		}

		System.out.println("bye~");

입력값앞에 print문을 사용하여 프롬프트를 만들고 for문안에 최대일수를 구하는 문장들을 넣어 여러번 반복하게 구현하였습니다. break문과 continue문을 활용하여 -1을 입력하면 반복을 중지하고 13이상의 값을 입력하면 다시 입력값을 받도록 구현하였습니다.

월별 최대 일수를 출력하여 달력모양 만들기


public class Calendar {

	private static final int[] MaxDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

	public static int getMaxDaysOfMonth(int month) {
		return MaxDays[month - 1];
	}

	public static void printCalendar(int year, int month) {

		System.out.printf("   <<%4d년%3d월>>\n", year, month);
		System.out.println(" SU MO TU WE TU FR SA");
		System.out.println("----------------------");
		int maxDay = getMaxDaysOfMonth(month);

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

		}

 	System.out.println();

	}

}
import java.util.Scanner;

public class Prompt {

	private final static String PROMPT = "cal> ";

	public void runPrompt() {

		Scanner scanner = new Scanner(System.in);
		Calendar cal = new Calendar();


		for (int i = 0;; i++) {

			System.out.println("달을 입력하세요:");
			System.out.print(PROMPT);
			int month = scanner.nextInt();

			if (month == -1) {
				System.out.println("Have a nice day!");
				break;
			} else if (month > 12) {
				continue;
			} else {

				cal.printCalendar(2020, month);;

				System.out.println("");
			}
		}

		System.out.println("bye~");
		scanner.close();
	}

	public static void main(String[] args) {

		// 셀 실행
		Prompt p = new Prompt();
		p.runPrompt();

	}

}

Calendar 클래스의 복잡성을 줄여주기 위해 입력받는 부분을 Prompt 클래스로 옮겨주고 달력을 작성하는 부분을 Calendar 클래스에 작성합니다. Calendar에서 반복문을 통해 각 월별 최대일수 만큼 숫자를 출력하게하고 그안의 조건문을 두어 7번째마다 줄바꿈을 할 수 있게하여 달력형식을 만들었습니다.

윤년기능 추가하기

public class Calendar {

	private static final int[] MaxDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	private static final int[] LeapMaxDays = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

	public static boolean isLeapYear(int year) {

		if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
			return true;
		else 
			return false;
	}

	public static int getMaxDaysOfMonth(int year, int month) {
		if(isLeapYear(year)) 
			return LeapMaxDays[month-1];
		else
		return MaxDays[month - 1];
	}

	public static void printCalendar(int year, int month) {
		System.out.printf("   <<%4d년%3d월>>\n", year, month);
		System.out.println(" SU MO TU WE TU FR SA");
		System.out.println("----------------------");

		int maxDay = getMaxDaysOfMonth(year, month);
	
		for (int i = 1; i <= maxDay; i++) {
			System.out.printf("%3d", i);
			if (i % 7 == 0) {
				System.out.println();
			}
		}
	}
	}
}
public class Prompt {
	private final static String PROMPT = "cal> ";
	public void runPrompt() {

		Scanner scanner = new Scanner(System.in);
		Calendar cal = new Calendar();

		int month = 0;
		int year = 0;

		for (int i = 0;; i++) {

			System.out.println("연도를 입력하세요:");
			System.out.print(PROMPT);
			year = scanner.nextInt();
			System.out.println("달을 입력하세요:");
			System.out.print(PROMPT);
			month = scanner.nextInt();

			if (month == -1) {
				System.out.println("Have a nice day!");
				break;
			} else if (month > 12) {
				continue;
			} else {

				cal.printCalendar(year, month);;

				System.out.println("");
			}
		}
		System.out.println("bye~");
		scanner.close();
	}
	public static void main(String[] args) {
		// 셀 실행
		Prompt p = new Prompt();
		p.runPrompt();
	}
}

Calendar 클래스에 윤년일때 월별 최대일수로 사용할 LeapMaxDays 배열을 추가하고 윤년조건 체크할 isLeapYear 메소드를 추가하였습니다. 그 후 getMaxDaysOfMonth 메소드에서 입력받은 연도가 윤년인지 여부에 따라 무슨 배열을 사용할지를 선택하게 한후 그 배열을 기존의 반복문에 사용함으로 윤년이 반영될 수 있게 하였습니다. 그 후 연과 월을 같이 입력받을 수 있도록 Prompt 클래스에 입력문을 추가하였습니다.

결과값)
연도를 입력하세요:
cal> 2020

달을 입력하세요:
cal> 2

   <<20202>>
 SU MO TU WE TU FR SA
----------------------
  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

이렇게 해서 연도와 월을 입력해서 기본적인 달력을 추가하는 예제를 구현해보았습니다. 캘린더 만들기2에서 아직 미비한 부분을 보충해서 만들도록 하겠습니다.

profile
배우는 개발 일기

0개의 댓글