본문 바로가기

DEVELOPMENT/JAVA

[JAVA] 연습문제 - 이번 달 달력(calendar) 만들기

문제


아래와 같이 오늘 날짜와 이번 달 달력을 출력하기

2022-11-19 토
SU MO TU WE TH FR SA
      01 02 03 04 05 
06 07 08 09 10 11 12 
13 14 15 16 17 18 19 
20 21 22 23 24 25 26 
27 28 29 30



풀이순서


1. 현재 날짜 구하기
2. 이번 달의 마지막일 구하기
3. 1일 요일 구하기
4. 1일 위치 정하기
5. 1일부터 마지막일까지 출력하기
6. 토요일에 해당하는 날 줄바꿈하기


전체코드

 

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class CalendarEx1 {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd E");
        System.out.println(df.format(cal.getTime()));
        System.out.println("SU MO TU WE TH FR SA");

        int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);

        cal.set(Calendar.DATE, 1);
        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
        
        for (int i = 1; i < dayOfWeek; i++) {
            System.out.print("   ");
        }
        for (int i = 1; i <= lastDay; i++) {
            System.out.printf("%02d ", i);
            if (dayOfWeek % 7 == 0) {
                System.out.println();
            }
            dayOfWeek++;
        }
    }
}



풀이과정



1. 현재 날짜 구하기

Calendar cal = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd E");
System.out.println(df.format(cal.getTime()));


Calendar cal = Calendar.getInstance();
Calendar클래스를 사용하기 위해 getInstance() 메서드로 Calendar클래스를 구현한 클래스의 인스턴스를 반환한다.
Calendar cal = new Calendar(); 를 하지 않는 이유는 Calendar는 추상클래스이기 때문에 직접 객체를 생성할 수 없고, 메서드로 완전히 구현된 클래스의 인스턴스를 얻어야 하기 때문이다.
getInstance() 메서드는 시스템의 현재 날짜와 시간으로 Calendar 인스턴스를 생성하여 반환한다.

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd E");
SimpleDateFormat는 날짜 데이터를 원하는 형식으로 출력하기 위해서 사용한다.
인스턴스를 생성한 다음, 출력하고자 하는 Date인스턴스를 가지고 format(Date d)를 호출하면 지정한 출력형식에 맞게 변환된 문자열을 얻게 된다.

getTime()
현재의 객체를 Date 객체로 변환한다.



2. 이번 달의 마지막일 구하기

int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);


getActualMaximum(int field)
현재 객체의 특정 필드의 최대 값을 int로 반환한다.

Calendar.DAY_OF_MONTH
현재 월의 날짜



3. 1일 요일 구하기

cal.set(Calendar.DATE, 1);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);

날짜를 현재 달의 1일로 설정하여 1일의 요일을 구한다.

set(int field, int value)
현재 객체의 특정 필드를 다른 값으로 설정한다.

Calendar.DATE
현재 월의 날짜

get(int field)
현재 객체의 주어진 값의 필드에 해당하는 상수 값을 반환한다.

Calendar.DAY_OF_WEEK
요일(1~7, 일요일:1)



4. 1일 위치 정하기

for (int i = 1; i < dayOfWeek; i++) {
    System.out.print("   ");
}

위에서 변수선언한 dayOfWeek는 현재 달의 1일의 요일을 정수로 표현한다. (1~7, 일요일:1)
dayOfWeek가 1(일요일)이면 공백없이(공백 개수 0) 01일이 출력되고, 2(월요일)이면 공백(" ") 개수가 1개, 3이면 공백 개수 2개... 의 형식으로 공백 개수가 출력될 수 있게 for문을 이용한다.



5. 1일부터 마지막일까지 출력하기
6. 토요일에 해당하는 날 줄바꿈하기

for (int i = 1; i <= lastDay; i++) {
    System.out.printf("%02d ", i);
    if (dayOfWeek % 7 == 0) {
        System.out.println();
    }
    dayOfWeek++;
}


System.out.printf("%02d ", i);
날짜를 두자리 정수로 출력한다. (1 => 01)

dayOfWeek % 7 == 0
토요일일때 dayOfWeek 값이 7이므로 7로 나누었을 때 나머지가 0이된다.
토요일에 해당하는 날 줄바꿈해준다.

dayOfWeek++;
for문으로 반복되면서 i가 바뀔때마다 요일이 바뀔수 있게 dayOfWeek의 값을 1씩 더해준다.



+) 현재 날짜가 아닌 다른 날짜를 설정하고 싶을 경우

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2023); // 년도 바꾸기
cal.set(Calendar.MONTH, Calendar.JANUARY); // 월 바꾸기
cal.set(Calendar.DATE, 1); // 일 바꾸기
cal.set(2022, 11, 25); // 년, 월(0~11, 1월:0), 일 바꾸기