해결된 질문
작성
·
137
1
1번째 질문 : 아래쪽 while 부분에 "%2d "가 어떻게 간격을 맞출 수 있는 건가요?
%는 연산자에서 나머지를 뜻하는데 뭔가 다른 기능이라도 있는 건가요?
2번째 질문 : int offsetWeekDays = first.getDayOfWeek().getValue() % 7; 는 날짜의 요일을 맞추기 위해서 만든 거 같은데 왜 굳이 끝에 '% 7'을 표시해서 나머지로 구하는 건가요?
'% 7'을 뺀다음에 first의 날짜를 2024. 1. 10 일로 바꿔도 정상작동하는데 뭔가 이유가 있는 건가요?
나머지로 값을 구하는 이유가 있을까요?
전체 코드 첨부하겠습니다!
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("년도를 입력하세요 : ");
int year = scanner.nextInt();
System.out.print("월을 입력하세요 : ");
int month = scanner.nextInt();
printCalendar(year, month);
}
private static void printCalendar(int year, int month) {
LocalDate first = LocalDate.of(year, month, 1);
LocalDate firstNext = first.plusMonths(1);
// 월요일 (1%7) = 1, 화요일 (2%7) = 2, ... 일요일(7%7) = 0
int offsetWeekDays = first.getDayOfWeek().getValue() % 7;
System.out.println("Su Mo Tu We Th Fr Sa");
for (int i = 0; i < offsetWeekDays; i++) {
System.out.print(" ");
}
LocalDate dayIterator = first;
while (dayIterator.isBefore(firstNext)) {
System.out.printf("%2d ", dayIterator.getDayOfMonth());
if (dayIterator.getDayOfWeek() == DayOfWeek.SATURDAY) {
System.out.println();
}
dayIterator = dayIterator.plusDays(1);
}
}
답변 1
1
안녕하세요. 권정익님
1번째 질문에 대한 답변
"%2d"는 printf 포맷 문자열에서 사용되는 형식 지정자입니다. 여기서 %는 형식 지정자의 시작을 나타내고, 2는 출력할 정수의 최소 너비를 지정합니다. d는 정수(decimal)를 의미합니다. 따라서 "%2d"는 정수를 최소 2자리로 출력하되, 값이 2자리보다 작으면 앞에 공백을 추가하여 너비를 맞춥니다. 이를 통해 달력의 날짜를 정렬할 수 있습니다.
예를 들어, 1일은 " 1" (앞에 공백이 있습니다.)로 출력되고, 10일은 "10"으로 출력됩니다. 이렇게 하면 날짜 간의 간격이 일정하게 유지됩니다.
2번째 질문에 대한 답변: int offsetWeekDays = first.getDayOfWeek().getValue() % 7;
에서 % 7
을 사용하는 이유는 자바의 DayOfWeek 열거형에서 월요일이 1, 화요일이 2, ..., 일요일이 7로 표현되기 때문입니다. 하지만 달력에서는 일요일을 0, 월요일을 1, ..., 토요일을 6으로 표현하는 것이 일반적입니다.
따라서 % 7
을 사용하여 DayOfWeek 값을 달력에서 사용하는 값으로 변환합니다. 예를 들어, 월요일(1)은 1 % 7 = 1
이 되고, 화요일(2)은 2 % 7 = 2
가 됩니다. 그리고 일요일(7)은 7 % 7 = 0
이 되어 달력에서의 표현과 일치하게 됩니다.
만약 % 7
을 뺀다면, offsetWeekDays 값은 월요일이 1, 화요일이 2, ..., 일요일이 7이 될 것입니다. 이 경우에도 first의 날짜를 2024년 1월 10일로 바꾸면 정상 작동할 수 있습니다. 그 이유는 2024년 1월 10일이 수요일이고, 수요일의 getValue() 값은 3이기 때문입니다. 하지만 이렇게 하면 일요일이 0이 아닌 7로 표현되어 달력의 일반적인 표현과는 다를 수 있습니다.
따라서 % 7
을 사용하는 것은 DayOfWeek 값을 달력에서 사용하는 값으로 변환하여 일관성을 유지하기 위한 것입니다.
감사합니다.