달력 출력 프로그램

- 수행 목적 : Scanner의 입력함수와 조건문 및 반복문을 통한 달력 계산 로직 작성

- 간략 소개 : 달력은 일반적인 전산시스템에서 많이 사용하는 컴포넌트입니다. 

입력 받은 년도와 월을 통해 달력을 출력하는 프로그램을 작성해 보세요.

 

※ 필수 준수사항

1. 입력 받은 년도와 월을 통한 달력 생성

2. 입력 값은 년도, 월을 입력

3. 날짜는 LocalDate 클래스를 이용(Calendar와 Date 클래스도 이용 가능)

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html

 

LocalDate (Java Platform SE 8 )

Returns a copy of this date with the specified field set to a new value. This returns a LocalDate, based on this one, with the value for the specified field changed. This can be used to change any supported field, such as the year, month or day-of-month. I

docs.oracle.com


LocalDate 클래스

Java 8부터 제공하는 날짜 정보와 관련된 처리를 도와주는 유용한 라이브러리 클래스

이전에는 Date, Calender 클래스가 있었으나 요새는 거의 안쓰는 추세

 

LocalDate 클래스를 사용하기 위해선 import java.time.LocalDate;를 사용해야 한다.

 

LocalDate와 LocalTime 클래스는 객체를 생성하기 위해 now(), of() 메소드라는 클래스 메소드를 제공한다.

now() : 현재의 날짜와 시간을 이용해 새로운 객체를 생성하여 반환

of() : 전달된 인수를 가지고 특정 날짜와 시간을 표현하는 새로운 객체를 생성하여 반환

LocalDate today = LocalDate.now();
LocalTime present = LocalTime.now();
System.out.println(today + " " + present);

now90 실행 결과

// static LocalDate of(int year, int month, int dayOfMonth)
        LocalDate birthDay = LocalDate.of(1996, 05, 24); // 특정 날짜 : 1996-05-24

// static LocalTime of(int hour, int minute, int second, int nanoOfSecond)
        LocalTime birthTime = LocalTime.of(12, 48, 00, 100000000);
        System.out.println(birthDay + " " + birthTime);

of() 실행 결과


TemporalField 인터페이스

- 월(month-of-year)과 시(hour-of-day)와 같이 날짜와 시간과 관련된 필드를 정의해 놓은 인터페이스이다.

- 이 인터페이스를 구현하여 날짜와 시간을 나타낼 때 사용하는 열거체가 바로 ChronoField이다.

import java.time.temporal.ChronoField;

- java.time 패키지를 구성하는 클래스의 메소드에서는 이 열거체를 이용해 날짜와 시간을 처리하고 있다.

 

- ChronoField 열거체에 정의된 대표적인 열거체 상수는 다음과 같다.

열거체 상수 설명
ERA 시대
YEAR 연도
MONTH_OF_YEAR
DAY_OF_YEAR
DAY_OF_WEEK 요일(일요일: 0, 월요일: 2, ..., 토요일: 6)
AMPM_OF_DAY 오전/오후
HOUR_OF_DAY 시(0~23)
CLOCK_HOUR_OF_DAY 시(1~24)
HOUR_OF_AMPM 시(0~11)
CLOCK_HOUR_OF_AMPM 시(1~12)
MINUTE_OF_HOUR
SECOND_OF_MINUTE
DAY_OF_YEAR 해당 연도의 몇 번째 날(1~365, 윤년이면 366)
EPOCH_DAY EPOCH(1970년 1월 1일)을 기준으로 몇 번째 날

 

달력 출력 프로그램을 만들기 위해 필요한 메서드

· DAY_OF_WEEK : 해당 날짜의 요일 값을 숫자로 출력해준다. (일요일을 0로 시작하여 토요일을 6까지 해당 요일에 따라 출력)

LocalDate monthstart = LocalDate.of(year, month, 1);
int monthday = monthstart.get(ChronoField.DAY_OF_WEEK); //해당 월의 첫 번째 요일 숫자로 확인
// 0: 일요일, 1: 월요일, 2: 화요일, 3: 수요일, 4: 목요일, 5: 금요일, 6: 토요일

· withDayOfMonth() 메서드와 lengthOfMonth() 메서드를 사용한 방법

//기준일자
LocalDate date = LocalDate.parse("2023-03-08");

//해당 월의 첫째 날
LocalDate firstDate = date.withDayOfMonth(1);                     // 2022-03-01

//해당 월의 마지막 날
LocalDate lastDate = date.withDayOfMonth(date.lengthOfMonth());   // 2023-03-31


작성 코드

// 달력 출력 프로그램

import java.time.LocalDate;
import java.time.temporal.ChronoField;
import java.util.Scanner;

public class Calendar {
    public static void main(String[] args) {
        System.out.println("[달력 출력 프로그램]");
        Scanner sc = new Scanner(System.in);

        System.out.print("달력의 년도를 입력해 주세요.(yyyy) : ");
        int year = sc.nextInt();
        System.out.print("달력의 월을 입력해 주세요.(mm) : ");
        int month = sc.nextInt();

        LocalDate localDate = LocalDate.of(year, month, 1);


        int monthday = localDate.get(ChronoField.DAY_OF_WEEK);
        //해당 월의 첫 번째 요일 확인
        // 0: 일, 1: 월, 2: 화, 3: 수, 4: 목, 5: 금, 6: 토
        //System.out.println(monthday); // 2021년 1월: 5출력 → 금
        int monthend = localDate.lengthOfMonth(); // 해당 월의 마지막 날짜(숫자)

        System.out.println();

        System.out.printf("[%d년 %02d월]\n", year, month);
        System.out.printf("%c\t%c\t%c\t%c\t%c\t%c\t%c\t\n", '일', '월', '화', '수', '목', '금', '토');

        int totalCount = 0;

        for (int i = 0; i < monthday; i++) {
            totalCount++;
        }
        for(int i = 0; i < totalCount; i++) {
            System.out.printf("\t");
        }

        for (int j = 1; j <= monthend; j++) {
            System.out.printf(String.format("%02d\t", j));
            totalCount++;
            if (totalCount % 7 == 0) {
                System.out.println();
            }
        }
    }
}

https://gist.github.com/coha96/69cd221db0e48320a211f4c1d79c5517