수행 목적 : Scanner의 입력함수와 조건문 및 반복문을 통한 달력 계산 로직 작성
간략 소개 : 달력은 일반적인 전산시스템에서 많이 사용하는 컴포넌트입니다. 입력받은 년도와 월을 통해 달력을 출력하는 프로그램을 작성해 보세요.
필수 준수사항
- 입력받은 년도와 월을 통한 달력 생성
- 입력값은 년도, 월을 입력
- 날짜는 LocalDate클래스를 이용(Calender와 Date클래스도 이용 가능)
- 출력은 입력한 달을 기준으로 이전달, 입력달, 현재달 출력(3달 출력)
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Scanner;
/**
* 달력 출력 프로그램
*/
public class CalenderPrint {
/**
* 주(week) 출력
*
* @param dayList 일(day) 리스트
*/
public static void printWeek(ArrayList dayList) {
// 한 주는 7일이기 때문에 7번 반복
for (int i = 0; i < 7; i++) {
// 리스트 0번 째 값이 String 타입인 탭(\t')이면 문자열 출력
// 아니면 2자리 정수 출력 후 0번 째 값 삭제
if (dayList.get(0) instanceof String) {
System.out.printf("%s", dayList.get(0));
} else {
System.out.printf("%02d\t", dayList.get(0));
}
dayList.remove(0);
}
System.out.print("\t");
}
/**
* 달력 출력
*
* @param dayList1 지난 달 달력
* @param dayList2 입력 달 달력
* @param dayList3 현재 달 달력
*/
public static void printCalender(ArrayList dayList1, ArrayList dayList2, ArrayList dayList3) {
// 달력에서 주(week)는 최대 6주이기 때문에 6번 반복해서 출력
for (int i = 0; i < 6; i++) {
printWeek(dayList1);
printWeek(dayList2);
printWeek(dayList3);
System.out.println();
}
}
/**
* 달력 생성
*
* @param year 년도
* @param month 월
* @param date 일
*/
public static void createCalender(int year, int month, int date) {
LocalDate now = LocalDate.now();
// 입력달 LocalDate 생성
LocalDate inputMonthCalender = LocalDate.of(year, month, date);
// 지난달 LocalDate 생성
if (month == 1) {
year--;
month = 12;
} else {
month -= 1;
}
LocalDate lastMonthCalender = LocalDate.of(year, month, date);
// 현재달 LocalDate 생성
LocalDate nowCalender = LocalDate.of(now.getYear(), now.getMonth(), date);
// 달력 제목 및 요일 출력
System.out.printf("[%tY년 %tm월]\t\t\t\t\t", lastMonthCalender, lastMonthCalender);
System.out.printf("[%tY년 %tm월]\t\t\t\t\t", inputMonthCalender, inputMonthCalender);
System.out.printf("[%tY년 %tm월]\t\t\t\t\t\n", nowCalender, nowCalender);
for (int i = 0; i < 3; i++) {
System.out.printf("일\t월\t화\t수\t목\t금\t토\t\t");
}
System.out.println();
ArrayList lastMonthList = createList(lastMonthCalender);
ArrayList inputMonthList = createList(inputMonthCalender);
ArrayList nowList = createList(nowCalender);
printCalender(lastMonthList, inputMonthList, nowList);
}
/**
* 일(day)을 리스트에 담기
*
* @param calender 달력
* @return ArrayList 일(day)로 이루어진 리스트
*/
public static ArrayList createList(LocalDate calender) {
ArrayList dayList = new ArrayList();
int startDate = 0;
int endDate = 0;
int date = 1;
// 해당 월 시작 요일의 int 값 (월요일 : 1 ~ 일요일 7)
startDate = calender.getDayOfWeek().getValue();
// 해당 월에 마지막 일
endDate = calender.lengthOfMonth();
// i 값이 해당 월 시작 요일의 값보다 작거나 해당 월에 마지막 일 보다 크면
// 리스에 탭(\t) 추가, 아니면 일(date++) 추가
for (int i = 0; i < 42; i++) {
if (i < startDate || i > endDate + (startDate - 1)) {
dayList.add("\t");
} else {
dayList.add(date);
date++;
}
}
return dayList;
}
public static void main(String[] args) {
int year = 0;
int month = 0;
int date = 1;
System.out.println("[달력 출력 프로그램]");
Scanner sc = new Scanner(System.in);
System.out.print("달력의 년도를 입력해주세요.(yyyy): ");
year = sc.nextInt();
System.out.print("달력의 월을 입력해주세요.(mm): ");
month = sc.nextInt();
createCalender(year, month, date);
sc.close();
}
}
먼저 년도와 월을 입력 받기 위해
Scanner를 통해 int값을 입력 받아 int year와 int month에 값을 넣었다.
총 3개의 달력을 만들기 위해 createCalender() 메소드를 만들었고,
LocalDate.of()를 이용해서 3개의 달력을 생성했다.
year, month는 사용자로 부터 입력받은 값으로 넣었고, date는 1로 초기화 한 뒤에 넣었다.
LocalDate.of(year, month, date);로 입력달 LocalDate를 생성했고,
지난달은 입력달에서 1을 빼서 만들면 되지만 입력달이 1월인 경우에는 12월로 해주고 년도는 작년으로 해줘야 하기 때문에 if 조건문으로 분기해서 진행했다.
month == 1 일 경우에는 year--; month = 12;로 했고
나머지 경우에는 month -= 1;을 했다.
현재달은 LocalDate.now()를 이용해서 연도와 월을 가져와 생성했다.
LocalDate now = LocalDate.now();
LocalDate.of(now.getYear(), now.getMonth, date);
지난달, 입력달, 현재달을 가로로 동시에 출력해야하기 때문에
달력 제목 및 요일을 먼저 출력했고,
해당 하는 달력을 만들어 주기 위한 작업을 진행했다.
createList()에서 달력을 입력받아
해당 월의 1일이 무슨 요일로 시작하는지 알기 위해서
getDayOfWeek().getValue();를 사용했다.
반환 값은 int로 월요일이 1부터 시작해서 일요일은 7로 되어 있다.
그리고 해당 월이 며칠로 끝나는 지 구하기 위해서
lengthOfMonth();를 사용했다.
이렇게 1일이 시작하는 위치와 마지막이 며칠인지 확인했고,
달력으로 표시할 때 최대 6주까지 달력으로 표시될 수 있기 때문에
반복문 for문을 이용해 ArrayList에 해당 달력의 일을 담아줬다.
반복문은 0부터 42로 진행했고,
1일이 시작하는 위치 전까지는 '\t'을 넣어 빈칸으로 만들었고,
마지막 일 보다 커도 '\t'을 넣었다.
달력을 출력할 때 3개의 달력이 가로로 출력되야 하기 때문에
ArrayList를 7번 출력하는 메소드를 for문으로 6번 반복 진행해서 구현했다.
실행결과
2024.04.12 - [Zero-base] - 주민등록번호 생성 프로그램 제로베이스 백엔드 스쿨 미니과제 4
2024.04.11 - [Zero-base] - 놀이동산 입장권 계산 프로그램 제로베이스 백엔드 스쿨 미니과제 3
2024.04.11 - [Zero-base] - 결제 금액 캐시백 계산 프로그램 제로베이스 백엔드 스쿨 미니과제 2
2024.04.10 - [Zero-base] - 콘솔 화면에 구구단 출력하기 제로베이스 백엔드 스쿨 미니과제 1
'📌Zero-base' 카테고리의 다른 글
로또 당첨 프로그램 제로베이스 백엔드 스쿨 미니과제 7 (0) | 2024.04.14 |
---|---|
가상 선거 및 당선 시뮬레이션 프로그램 제로베이스 백엔드 스쿨 미니과제 6 (0) | 2024.04.13 |
주민등록번호 생성 프로그램 제로베이스 백엔드 스쿨 미니과제 4 (0) | 2024.04.12 |
놀이동산 입장권 계산 프로그램 제로베이스 백엔드 스쿨 미니과제 3 (0) | 2024.04.11 |
결제 금액 캐시백 계산 프로그램 제로베이스 백엔드 스쿨 미니과제 2 (0) | 2024.04.11 |