Java/[문제해결]

[Java의 정석_기초편] 날짜와 시간 & 형식화_연습문제 10-1 (p.383)

줌인. 2024. 3. 26. 22:39

[p.383] Calendar클래스와 SimpleDataFormat 클래스를 이용해서 2020년의 매월 두 번째 일요일 날짜를 출력

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

class Exercise1 {

    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();

        DateFormat df = new SimpleDateFormat("yyyy-MM-dd은 F번째 E요일입니다.");

        for (int i=0; i < 12 ; i++) {
            cal.set(Calendar.YEAR, 2020); //고정값
            cal.set(Calendar.DAY_OF_WEEK, 1); //고정값
            cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, 2); //변동값
            cal.set(Calendar.MONTH, i); //변동값

            Date date = new Date(cal.getTimeInMillis());
            System.out.println(df.format(date));
        }
    }
}

 

<풀이 과정>

1) 2020년의 2번째 일요일이 키포인트라고 판단

2) 1월부터 12월 사이의 값 추출 ⇒ 즉 월은 바뀌되, 년/요일/n번째는 고정

3) Calendar 함수 설정

4) SimpleDataFormat으로 형식화 설정

5) Month 반복문 설정_for문

6) Calendar 객체를 Date로 변경

7) 만들어진 형식화로 출력

 

 

<시행 착오>

1) 사고

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

class Exercise1_2 {

    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        //dateformat 사용을 위해서 cal -> date화 해야함

        Date date = new Date(cal.getTimeInMillis());
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd은 F번째 E요일입니다.");


        for (int i = 0; i < 12 ; i++) {
            cal.set(Calendar.YEAR, 2020);
            cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, 2);
            cal.set(Calendar.DAY_OF_WEEK, 1);
            cal.set(Calendar.MONTH, i);
        }
        System.out.println(df.format(date));

        //아무것도 없거든 그래서 세팅값을 일단 2020년으로 맞추자
        //2) 2번쨰 일요일을 2020년도에서 찾아야할 것 같음 -> 일단 이게 문젠데 어떻게 찾냐
        //Calendear.year = 2020년 설정하고, while 문에서 get하는 거야 F번째 E요일을 yy-MM-dd를
    }
}

 

2) 코드 수정

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

public class Exercise1 {

    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();

        cal.set(Calendar.YEAR, 2020); // 고정값
        cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); // 일요일로 고정
        cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, 2); // 2번째로 고정

        DateFormat df = new SimpleDateFormat("yyyy-MM-dd은 F번째 E요일입니다.");

        for (int i = 0; i < 12; i++) {
            cal.set(Calendar.MONTH, i); // 월을 변경하여 2번째 일요일을 찾음
            Date date = new Date(cal.getTimeInMillis());
            System.out.println(df.format(date));
        }
    }
}

* 요일이 변경되는 문제가 발생 (일 -> 월 -> 화.. +++)

 

3) 최종 수정

: `Calendar` 객체의 상태가 반복문 안에서 변경되고 있기 때문에 문제가 발생했다.

   `Calendar` 객체는 참조 타입이기 때문에 `cal` 변수가 변경되면 이전에 생성된 `Date` 객체가 영향을 받는다.

    이를 해결하기 위해서는 매번 새로운 `Calendar` 객체를 생성하여 사용해야 한다.
   >> 따라서 각각의 반복에서 독립적인 `Calendar` 객체를 사용하므로 원하는 결과를 얻었다.


 

[남궁성 선생님 풀이_원본]

1) 주석 / 코드

import java.util.*;
        import java.text.*;
class Exercise10_1
{
    public static void main(String[] args)
    {
        Calendar cal = Calendar.getInstance();
        cal.set(2020, 0, 1); // cal 2020 1 1 의 날 를 년 월 일로 설정 
        for(int i=0; i < 12;i++) {
            int weekday = cal.get(Calendar.DAY_OF_WEEK); // 1 . 일의 요일을 구한다
// 1 . 두 번째 일요일은 일의 요일에 따라 달라진다
// 1 8 , 일이 일요일인 경우에는 두번째 일요일은 일이고
// 1 16 1 (weekday) . 일이 다른 요일일 때는 에서 일의 요일 을 빼면 알 수 있다
            int secondSunday = (weekday==1) ? 8 : 16 - weekday;
// (secondSunday) cal (DAY_OF_MONTH) . 두 번째 일요일 로 의 날짜 를 바꾼다
            cal.set(Calendar.DAY_OF_MONTH, secondSunday);
            Date d = cal.getTime(); // Calendar Date . 를 로 변환한다
            System.out.println(new SimpleDateFormat("yyyy-MM-dd F E 은 번째 요일입니
                    다.").format(d));
// 1 . 날짜를 다음달 일로 변경한다
                    cal.add(Calendar.MONTH, 1);
            cal.set(Calendar.DAY_OF_MONTH,1);
        }
    }
}

 

2) 코드만

import java.util.*;
        import java.text.*;
class Exercise10_1
{
    public static void main(String[] args)
    {
        Calendar cal = Calendar.getInstance();
        cal.set(2020, 0, 1); 
        for(int i=0; i < 12;i++) {
            int weekday = cal.get(Calendar.DAY_OF_WEEK); 
            int secondSunday = (weekday==1) ? 8 : 16 - weekday;
            cal.set(Calendar.DAY_OF_MONTH, secondSunday);
            Date d = cal.getTime(); 
            System.out.println(new SimpleDateFormat("yyyy-MM-dd F E 은 번째 요일입니
                    다.").format(d));
                    cal.add(Calendar.MONTH, 1);
            cal.set(Calendar.DAY_OF_MONTH,1);
        }
    }
}

 

 

 

 

728x90