본문 바로가기
개발/언어

java.util.Date 와 java.util.Calendar 를 사용하지말자

by 얼굴값하는사람 2024. 1. 30.
반응형

자바에서 날짜 관련 처리시에 사용하지 말아야 할 대표적인 클래스 2개를 알아보겠습니다.

java.util.Date

클래스는 Java에서 날짜와 시간 정보를 표현하기 위한 클래스 중 하나입니다. 그러나 이 클래스는 여러 가지 문제와 한계를 가지고 있어서, Java 8 이후에는 java.time 패키지의 클래스들을 사용하는 것이 권장됩니다. 아니 사용하지 마세요

java.util.Date 클래스의 주요 특징:

  1. 가변성 (Mutability):
    • java.util.Date는 가변 클래스로 설계되어 있어 객체가 생성된 이후에 내부 값을 변경할 수 있습니다. 이로 인해 다중 스레드 환경에서의 안정성이 보장되지 않습니다.
  2. 년 월 일 시 분 초 밀리초 표현:
    • java.util.Date는 1970년 1월 1일 00:00:00 GMT(그리니치 표준시)부터의 경과 시간을 밀리초로 표현합니다. 그러나 이 클래스의 메서드 중 일부는 초 단위의 정밀도를 가지고 있습니다.
  3. 타임존 관리 어려움:
    • java.util.Date는 타임존 정보를 내부적으로 가지고 있지 않아서, 특정 타임존과의 관련성을 갖기 위해서는 추가적인 처리가 필요합니다.
  4. deprecated 메서드 존재:
    • 많은 java.util.Date 메서드들이 deprecated되어 있습니다. 이는 이후의 Java 버전에서는 더 이상 권장되지 않는다는 의미이며, 대신에 java.time 패키지의 클래스들을 사용할 것을 권장합니다.
  5. 정확성 부족:
    • java.util.Date는 밀리초 단위까지만 정확하게 표현이 가능하며, 더 높은 정밀도가 필요한 경우에는 부적합합니다.

 

예제 코드 입니다.

import java.util.Date;

public class DateExample {
    public static void main(String[] args) {
        // 현재 날짜와 시간 얻기
        Date currentDate = new Date();
        System.out.println("Current Date and Time: " + currentDate);

        // 특정 시간으로 설정
        long specificTimeMillis = 1642243200000L; // 2022년 1월 16일 00:00:00 GMT
        Date specificDate = new Date(specificTimeMillis);
        System.out.println("Specific Date and Time: " + specificDate);
    }
}

 

대안:

Java 8 이후에는 java.time 패키지의 클래스들을 사용하는 것이 권장됩니다. LocalDate, LocalDateTime, ZonedDateTime 등의 클래스들은 불변하고 정확한 시간 다루기를 지원하며, java.util.Date에서 발생했던 문제를 해결 했습니다. 자바 7 이하가 존재한다면 아래 joda-time 을 사용하는걸로..

 

 

java.util.Calendar 

클래스는 Java에서 날짜 및 시간을 다루기 위한 클래스 중 하나로, 과거에 주로 사용되었지만 여러 문제점을 가지고 있습니다. 이러한 문제점은 다음과 같습니다:

 

  1. 가변성 (Mutability):
    • Calendar 클래스는 가변 클래스로 설계되어 있어, 객체 생성 후에 내부 상태를 변경할 수 있습니다. 이로 인해 다중 스레드 환경에서 안전하지 않고, 예상치 못한 부작용이 발생할 수 있습니다.
  2. 인덱스 기반 필드:
    • Calendar의 필드 중 많은 것들이 0부터 시작하는 인덱스를 사용합니다. 예를 들어, 월(month)은 0부터 11까지의 값을 갖습니다. 이는 혼란을 초래할 수 있고, 코드를 이해하기 어렵게 만듭니다.
  3. 상수의 일부만 정의:
    • Calendar 클래스는 상수를 사용하여 필드를 나타냅니다. 그러나 일부 필드에 대한 상수만 정의되어 있고, 다른 일부 필드에 대한 상수가 빠져 있습니다. 이로 인해 필드를 나타내는데 있어서 불완전하고 불명확한 부분이 있습니다.
  4. 월의 경우 상수가 별도로 존재:
    • 월을 나타내기 위해 Calendar 클래스에서는 Calendar.JANUARY, Calendar.FEBRUARY와 같은 상수를 제공합니다. 이는 가독성을 떨어뜨리고, 0부터 시작하는 인덱스와의 혼동을 야기할 수 있습니다.
  5. 타임존 관리 어려움:
    • Calendar 클래스는 타임존을 다루는 데에 있어서 어려움을 초래합니다. 타임존 정보를 적절하게 처리하지 못하고, TimeZone 클래스를 사용해야 하는 경우가 많아 불편함을 초래합니다.
  6. 디자인이 복잡하고 비직관적:
    • Calendar 클래스의 API 디자인이 비직관적이며 복잡합니다. 일부 메서드의 명칭이나 동작이 예상과 다를 수 있어서 사용자가 코드를 이해하기 어렵게 만듭니다.
  7. Java 8 이후의 대안이 존재:
    • Java 8부터는 java.time 패키지에서 날짜와 시간을 처리하는 새로운 API가 도입되었습니다. java.time 패키지의 클래스들은 불변하고 쓰레드 안전하며, 더욱 직관적이고 효율적으로 날짜와 시간을 다룰 수 있도록 설계되었습니다.

따라서 Java 8 이상의 버전을 사용하는 경우에는 java.util.Calendar보다는 java.time 패키지의 클래스를 사용하는 것이 권장됩니다.

 

 

Joda-Time 라이브러리

Java 8 이전에는 joda-time 라이브러리가 Java에서 날짜와 시간을 다루는 데 많이 사용되었습니다. 그러나 Java 8부터는 java.time 패키지가 도입되어서, 대부분의 경우에는 java.time 패키지의 클래스를 사용하는 것이 권장됩니다. 하지만 joda-time을 사용하는 방법에 대해서도 알아보겠습니다.

Joda-Time 라이브러리 사용하기

  1. 라이브러리 추가:
    • 먼저, 프로젝트의 의존성에 joda-time 라이브러리를 추가합니다. Maven을 사용하는 경우 pom.xml 파일에 다음과 같이 추가할 수 있습니다
<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.10.10</version> <!-- 최신 버전 사용 가능 -->
</dependency>

Joda-Time 사용 예시:

  • 간단한 joda-time 사용 예시를 보겠습니다.
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class JodaTimeExample {
    public static void main(String[] args) {
        // 현재 날짜와 시간 얻기
        DateTime currentDateTime = DateTime.now();
        System.out.println("Current Date and Time: " + currentDateTime);

        // 날짜 포맷 지정
        DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
        String formattedDateTime = currentDateTime.toString(formatter);
        System.out.println("Formatted Date and Time: " + formattedDateTime);

        // 특정 날짜와 시간 생성
        DateTime specificDateTime = new DateTime(2022, 1, 15, 14, 30, 0);
        System.out.println("Specific Date and Time: " + specificDateTime);

        // 날짜 계산
        DateTime nextWeek = currentDateTime.plusWeeks(1);
        System.out.println("Next Week: " + nextWeek);
    }
}
  1. 이것은 간단한 예시일 뿐이며, joda-time에는 날짜 및 시간 조작에 유용한 다양한 기능이 있습니다.
  2. 참고:
    • 지겹게 설명합니다.
    • Java 8부터는 java.time 패키지가 제공되므로, 가능하면 Java 8 이상의 버전을 사용하고 해당 패키지를 활용하는 것이 좋습니다. java.time 패키지는 joda-time에서 얻은 교훈을 바탕으로 설계되었으며, 더욱 간결하고 효율적인 기능을 제공합니다.
 
 
 

참고자료

https://d2.naver.com/helloworld/645609

 

반응형

'개발 > 언어' 카테고리의 다른 글

java) lombok builder 사용시 generic 사용하기  (0) 2025.01.31
Kotlin) Coroutine 알아보기 - 중요  (0) 2024.01.09