달력 출력 프로그램
- 수행 목적 : 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);

// 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);

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
'JAVA > 백엔드_미니과제' 카테고리의 다른 글
| 로또 당첨 프로그램 (0) | 2023.03.10 |
|---|---|
| 가상 대선 당선 시뮬레이션 프로그램 (0) | 2023.03.10 |
| 주민등록번호 생성 프로그램 (0) | 2023.03.07 |
| 놀이동산 입장권 계산 프로그램 (0) | 2023.03.07 |
| 결제 금액 캐시백 계산 프로그램 (0) | 2023.03.06 |