Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 연·월·일 값으로 날짜 객체를 만드는 3가지 방법

of() 메서드 사용하기

java.time.LocalDate 클래스의 of() 메서드는 연도(year), 월(month), 일(day) 값을 매개변수로 받아 해당 날짜를 나타내는 LocalDate 객체를 생성해 반환합니다. Java 8부터 도입된 java.time API는 불변(immutable)이며 스레드에 안전하기 때문에 새 프로젝트에서 가장 권장되는 방식입니다.

예제

import java.time.LocalDate;

public class Test {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2014, 9, 11);
        System.out.println("Date Value: " + date);
    }
}

출력 결과

Date Value: 2014-09-11

GregorianCalendar 클래스 사용하기

java.util.GregorianCalendar 클래스의 생성자 중 하나는 연도, 월, 일 값을 받아 이를 나타내는 Calendar 객체를 생성합니다. 생성된 객체에서 get() 메서드와 Calendar의 상수 필드를 조합하면 일, 월, 연도 정보를 각각 추출할 수 있습니다.

주의할 점은 Calendar에서 월(MONTH) 값이 0부터 시작한다는 것입니다. 즉, 생성자에 7을 넘기면 실제로는 8월을 의미하며, get(Calendar.MONTH) 역시 0 기준 값(7 = 8월)을 반환합니다. 직관적이지 않아 많은 개발자가 실수하기 쉬운 부분입니다.

예제

import java.util.*;

class Test {
    public static void main(String args[]) {
        // 캘린더 객체 생성
        Calendar cal = new GregorianCalendar(2020, 07, 18);
        int day = cal.get(Calendar.DAY_OF_MONTH);
        int month = cal.get(Calendar.MONTH);
        int year = cal.get(Calendar.YEAR);
        System.out.println("Day: " + day);
        System.out.println("Month: " + month);
        System.out.println("Year: " + year);
    }
}

출력 결과

Day: 18
Month: 7
Year: 2020

SimpleDateFormat 클래스 사용하기

java.text.SimpleDateFormat 클래스는 원하는 날짜 형식을 나타내는 패턴 문자열을 생성자로 받아 형식화 객체를 생성합니다. 문자열을 Date 객체로 변환(파싱)하는 절차는 다음과 같습니다.

  • 원하는 형식의 패턴 문자열을 전달하여 SimpleDateFormat 인스턴스를 생성합니다.
  • parse() 메서드를 호출해 날짜 문자열을 Date 객체로 변환합니다.

패턴에서 yyyy는 연도, MM은 월, dd는 일을 의미합니다. 아래 예제는 "연도-일-월" 순서로 작성된 문자열을 파싱하는 경우입니다.

예제

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Sample {
    public static void main(String args[]) throws ParseException {
        String date_string = "2007-25-06";
        // SimpleDateFormat 클래스 인스턴스 생성
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-dd-MM");
        // 주어진 문자열을 Date 객체로 파싱
        Date date = formatter.parse(date_string);
        System.out.println("Date value: " + date);
    }
}

출력 결과

Date value: Mon Jun 25 00:00:00 IST 2007

마무리 정리

세 가지 방법 중 새로운 프로젝트라면 스레드 안전성과 직관적인 API를 갖춘 LocalDate.of()를 사용하는 것이 가장 좋습니다. 레거시 코드와의 호환이 필요하다면 GregorianCalendar나 SimpleDateFormat을 사용할 수 있는데, 특히 SimpleDateFormat은 내부 상태를 공유하기 때문에 멀티스레드 환경에서 스레드에 안전하지 않으므로 각 스레드별로 별도 인스턴스를 사용하거나 ThreadLocal로 관리하는 것이 안전합니다.