인프런 커뮤니티 질문&답변

권정익님의 프로필 이미지
권정익

작성한 질문수

김영한의 실전 자바 - 중급 1편

섹션6. 문제와 풀이

해결된 질문

작성

·

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 값을 달력에서 사용하는 값으로 변환하여 일관성을 유지하기 위한 것입니다.

감사합니다.

권정익님의 프로필 이미지
권정익

작성한 질문수

질문하기