본문 바로가기

개발

[Java] 자바로 달력 만들기(콘솔출력)

아주 예전에 스터디용으로 만든 달력 코드를 다시 정리해서 올린다.

오픈소스가 많아서 직접 만들일은 없겠지만 그냥 재미삼아~




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
import javax.swing.JOptionPane;
 
public class testMain {
    public static void main(String[] args) {
 
        // input 예외처리
        String input = JOptionPane.showInputDialog("Input Year");
        if(!isNumber(input)){
            JOptionPane.showMessageDialog(null"연도는 숫자만 입력해 주세요.");
            System.exit(0);
        }
        int year = Integer.parseInt(input);        
        if (year <= 0) {
            JOptionPane.showMessageDialog(null"연도는 0보다 큰 숫자만 가능합니다.");
            System.exit(0);
        }
 
        input = JOptionPane.showInputDialog("Input Month");
        if(!isNumber(input)){
            JOptionPane.showMessageDialog(null"월은 숫자만 입력해 주세요.");
            System.exit(0);
        }
        int month = Integer.parseInt(input);
        if (month > 12 || month < 0) {
            JOptionPane.showMessageDialog(null"월은 0보다 크고 13보다 작은 숫자만 가능합니다.");
            System.exit(0);
        }
 
        printCalender(year, month);
        System.exit(0);
    }
    
    // 숫자 여부 체크
    public static boolean isNumber(String str){
        boolean result = false
        try{
            Double.parseDouble(str) ;
            result = true ;
        }catch(Exception e){}
         
         
        return result ;
    }
     
    
    // 달력의 타이틀과 바디
    private static void printCalender(int year, int month) {
        printMonthTitle(year, month);
        printMonthBody(year, month);
 
    }
 
    // 해당 년도가 윤년인지 판별
    public static boolean isLeapYear(int year) {
        return (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0));
    }
 
    // 달력 바디 출력
    private static void printMonthBody(int year, int month) {
        int count = 0;
 
        for (int i = 1; i <= getNumberOfDaysInMonth(year, month); i++) {
            if (i < 2) {
                for (int y = 1; y <= getStartDay(year, month); y++) {
                    System.out.print("\t ");
                    count += 1;
                }
            }
 
            System.out.printf("\t %2d", i);
            count += 1;
            if (count == 7) {
                System.out.println();
                count = 0;
            }
        }
    }
 
    // 해당 달의 첫 요일을 구해서 돌려줌.
    private static int getStartDay(int year, int month) {
        int monthSum = 0;
        int leapYear = 0;
        int daySum = 1;
 
        for (int i = 1; i < year; i++) {
            monthSum += 365;
            if (isLeapYear(i) == true) {
                leapYear += 1;
            }
        }
 
        for (int j = 1; j < month; j++) {
            daySum += getNumberOfDaysInMonth(year, j);
        }
 
        return (monthSum + leapYear + daySum) % 7;
 
    }
 
    // 달의 마지막 일을 구함
    private static int getNumberOfDaysInMonth(int year, int month) {
 
        if (month == 4 || month == 6 || month == 9 || month == 11) {
            return 30;
        } else if (month == 2 && isLeapYear(year) == true) {
            return 29;
        } else if (month == 2 && isLeapYear(year) == false) {
            return 28;
        } else {
            return 31;
        }
    }
 
    // 달의 타이틀 부분 출력
    private static void printMonthTitle(int year, int month) {
        System.out.println();
        System.out.println("\t" + year + "년\t\t\t\t\t\t" + getMonthName(month));
        System.out.println("\t===================================================");
        System.out.println("\t일\t월\t화\t수\t목\t금\t토");
        System.out.println("\t===================================================");
    }
    
    private static String getMonthName(int month) {
        String monthName = null;
        switch (month) {
        case 1:
            monthName = "1월";
            break;
        case 2:
            monthName = "2월";
            break;
        case 3:
            monthName = "3월";
            break;
        case 4:
            monthName = "4월";
            break;
        case 5:
            monthName = "5월";
            break;
        case 6:
            monthName = "6월";
            break;
        case 7:
            monthName = "7월";
            break;
        case 8:
            monthName = "8월";
            break;
        case 9:
            monthName = "9월";
            break;
        case 10:
            monthName = "10월";
            break;
        case 11:
            monthName = "11월";
            break;
        case 12:
            monthName = "12월";
            break;
        }
        return monthName;
    }
}
cs



이클립스를 이용한다면 위코드를 입력한후 F11으로 실행한다.


다이얼로그로 연도와 월을 입력받아서 출력하는 형식이다.

올바른 연도와 달을 입력한다면 다음과 같은 화면을 콘솔창에서 볼수 있다.



결과 출력(콘솔)


그나저나 올해도 벌써 다 지나갔구나..

내년에도 열심히 살아보자~ 




맨 위로