섹션6. 문제와 풀이
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 값을 달력에서 사용하는 값으로 변환하여 일관성을 유지하기 위한 것입니다.
감사합니다.
문제와 풀이
0
25
1
섹션 2 퀴즈 9번
0
34
2
강의노트 내용이 이해가 되지 않아서 문의드립니다.
0
48
1
중급1편, 래퍼클래스 문제와풀이2 로또제너레이터 질문
0
68
1
setVlaue질문
0
95
3
안녕하세요 코딩테스트와 병행하고 싶어서 질문드립니다.
0
95
1
findValue의 파라메터까지 래퍼클래스 배열인 이유가 있을까요?
0
76
1
아래 글처럼 toString() 강의부터 화면이 안보여요
0
99
2
TemporalAdjusters의 lastDayOfNextMonth(), lastDayOfNextYear() 메서드 지원 안함
0
84
2
오타 제보도 되나요?
0
91
2
지역 클래스 예제3 지역변수 질문
0
69
2
래퍼클래스 박싱 출력
0
60
1
자바 equals() 메소드에 대한 물리적 동일성, 논리적 동등성 질문
0
107
3
강의록 오타 제보
0
69
2
자바의 기본 클래스들에 관하여
0
71
1
실무에서 중첩(내부) 클래스 사용하나요?
0
81
1
지역 클래스 - 지역 변수 캡처3
0
56
1
12:30 의 newClassGrade 질문이 있습니다.
0
57
1
날짜와 시간 문제풀이가 막히는데
0
100
2
내부 클래스의 바깥 클래스 참조
0
68
1
스트링 풀, new String()
0
105
3
정적 중첩 클래스 사용 이유
0
97
1
status.getCode() 대신 status.code 사용
1
82
1
메서드의 지역변수명과 내부클래스의 멤버메서드에서의 지역변수명의 중복관련
0
75
1





