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로 관리하는 것이 안전합니다.