10.1 날짜와 시간 소개 (Date & Time Introduction)
안내: 이 문서는 Java 21 버전을 기준으로 작성되었습니다.
자바로 "오늘 날짜가 뭐야?", "이 두 날짜 사이에 며칠이야?", "결제한 지 30일이 지났어?" 같은 질문에 답하려면 날짜와 시간을 다루는 전용 클래스를 알아야 합니다.
자바 역사에서 날짜와 시간을 처리하는 방법은 크게 두 세대로 나뉩니다.
1. 구세대(Legacy): Calendar, Date 클래스
자바가 처음 만들어질 당시부터 존재하던 java.util.Calendar와 java.util.Date 클래스입니다. 지금도 오래된 코드(레거시)에서 자주 보게 됩니다.
import java.util.Calendar;
Calendar cal = Calendar.getInstance();
System.out.println("현재 연도: " + cal.get(Calendar.YEAR)); // 예: 2026
System.out.println("현재 월: " + (cal.get(Calendar.MONTH) + 1)); // 주의! 월은 0부터 시작해서 +1 필요
System.out.println("현재 일: " + cal.get(Calendar.DAY_OF_MONTH));
왜 쓰지 말라고 할까요?
Calendar와Date는 태생적인 설계 결함 때문에 현업에서는 사용을 강력히 지양합니다.
- 월(Month)이 0부터 시작합니다.(1월 = 0, 12월 = 11 → 버그 지뢰밭!)
- 객체가 변경 가능(Mutable) 해서 여러 곳에서 공유하면 버그 유발.
- 스레드(Thread) 환경에서 안전하지 않습니다.
2. 신세대(Modern): java.time 패키지 (Java 8+)
Java 8부터 혁신적으로 도입된 java.time 패키지는 위의 모든 단점들을 완벽히 개선 했습니다. 현재 자바의 날짜/시간 표준 입니다.
java.time 패키지의 핵심 클래스:
| 클래스 | 용도 |
|---|---|
LocalDate | 날짜만 (연도, 월, 일). 시간 정보 없음 |
LocalTime | 시간만 (시, 분, 초). 날짜 정보 없음 |
LocalDateTime | 날짜 + 시간 모두 포함 |
ZonedDateTime | 타임존(시간대, 예: Asia/Seoul)까지 포함 |
Duration | 두 시간 사이의 간격 (초, 밀리초 단위) |
Period | 두 날짜 사이의 간격 (년, 월, 일 단위) |
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
// 현재 날짜 가져오기
LocalDate today = LocalDate.now();
System.out.println("오늘: " + today); // 2026-03-13
// 현재 시간 가져오기
LocalTime now = LocalTime.now();
System.out.println("지금 시간: " + now); // 17:30:08.123
// 날짜와 시간 둘 다
LocalDateTime dateTime = LocalDateTime.now();
System.out.println("날짜 + 시간: " + dateTime); // 2026-03-13T17:30:08.123
// 특정 날짜를 직접 지정하고 싶을 때
LocalDate birthday = LocalDate.of(1995, 6, 15); // 월이 1부터 시작! 매우 직관적
System.out.println("생일: " + birthday); // 1995-06-15
java.time 패키지, 특히 LocalDate와 LocalDateTime은 앞으로 자바 실무 전반에 걸쳐서 매우 자주 접하게 될 클래스들입니다. 다음 챕터에서 날짜 계산과 형식(Formatting) 변환을 배워봅니다.