1. Date와 Time소개


등장 배경

Date date = new Date();
Calendar calendar = new GregorianCalendar();
SimpleDateFormat dateFormat = new SimpleDateFormat();

Java 8 이전 사용되는 날짜와 시간 API는 DateCalendar, GregorianCalendar등이 있습니다.

이렇게 기존에 존재하던 API들은 문제점이 있었는데 하나씩 살펴보자면,

  1. 클래스 이름이 명확하지가 않다.

    ⇒ 날짜 클래스중 DateDate인데도 불구하고 시간도 사용가능하고, TimeStamp도 표현할 수 있습니다. 사실상 TimeStamp라 볼 수 있습니다. 그리고 시간을 가져와도 이 시간값은 우리가 아는 시간이 아닌 에폭타임 이라 하여 세계 표준시(UTC)로 1970년 1월 1일 00시 00분 00초를 기준으로 현재까지 흐른 모든 시간을 초(sec)단위로 표현한 것입니다.

  2. Mutable 하여 thread safe하지 않다.

    public static void main(String[] args) throws InterruptedException {
        Date date = new Date();
        long time = date.getTime();
        System.out.println("date = " + date);
        Thread.sleep(1000 * 3);
        Date after3Seconds = new Date();
        System.out.println("after3Seconds = " + after3Seconds);
    
        after3Seconds.setTime(time);
        System.out.println("after3Seconds = " + after3Seconds);
    }
    /*
    [실행 결과]
    date = Thu Oct 29 20:22:24 KST 2020
    after3Seconds = Thu Oct 29 20:22:27 KST 2020
    after3Seconds = Thu Oct 29 20:22:24 KST 2020
    */
    

    ⇒ 최초 코드 실행시 시간을 출력 후 3초 후에 다시 Date 인스턴스를 생성해 출력해줬습니다.

    그 다음 setTime(time)으로 최초 생성한 date를 새로 생성한 after3Seconds 에 set 해 준뒤 출력하니 최초에 생성했을 당시의 시간이 출력되었습니다. 이는 Date 클래스가 mutable 하다는 것을 의미합니다.

    ⇒ thread unsafe하다는 의미는 아래 그림처럼 하나의 Date 인스턴스의 값을 각각 다른 Thread에서 접근해서 변경이 가능하면 기존에 사용하던 Thread에서 변경 되어 잘못된 Date정보를 가져와서 버그가 발생할 위험이 있습니다.

    https://s3-us-west-2.amazonaws.com/secure.notion-static.com/554691b4-4188-410d-8cac-a5cc41c2758c/Untitled.png

  3. 버그 발생할 여지가 많다. ⇒ Thread unsafe 할 뿐 아니라 사용법 자체에서도 사용법에 대해 오해할 수 있어 버그가 발생할 여지가 있다.

    Calendar birthDay = new GregorianCalendar(1988, 6, 10);
    

    ⇒ 생일이 1988년 6월 10일이라고 할 때 위 코드는 맞는 코드일까? 답은 틀렸다입니다. GregorianCalendar에서 month는 0부터시작하기 때문에 6을 넣으면 7월이라는 의미가 됩니다.

    그렇기에 5를 넣어야하고 헷갈리지 않게 하기 위해서 상수값을 쓰곤 합니다. (ex: Calendar.JUNE)

  4. 그래서 Java 8 이전에는 Joda-Time을 사용했습니다.

    Joda-Time - Home

Java 날짜 및 시간 API가 가져야할 디자인 철학

주요 API 특징