Date

Java μ—μ„œ λ‚ μ§œ/μ‹œκ°„μ„ ν‘œμ‹œν•˜λŠ” λ°©λ²•μœΌλ‘œ 주둜 μ‚¬μš©λ˜λ‚˜ μ΄λŠ” μ•„λž˜μ˜ λ¬Έμ œμ μ„ 가지고 μžˆλ‹€.

문제점

κΈ°μ‘΄ μžλ°”μ—μ„œ Calendar, Date ν΄λž˜μŠ€λŠ” μ—¬λŸ¬ λ¬Έμ œμ μ„ 가지고 μžˆλ‹€

μ΄λŠ” Naver D2 μ—μ„œλ„ λ‚΄μš©μ„ 닀루고 μžˆλ‹€.

이λ₯Ό μš”μ•½ν•˜μžλ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • λΆˆλ³€ 객체가 μ•„λ‹ˆλ‹€.
    • set 으둜 λ³€κ²½ κ°€λŠ₯함
    • μ΄λŠ” μ•…μ˜μ μΈ μ½”λ“œλ‘œ μ‚¬μš©κ°€λŠ₯ ν•˜κΈ° λ•Œλ¬Έμ— 직접 Date ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©ν•˜λŠ”κ²ƒμ€ μœ„ν—˜ν•˜λ‹€.
  • μƒμˆ˜ ν•„λ“œμ˜ λ‚¨μš©
    • calendar.add(Calendar.SECOND, 2)
  • ν˜Όλž€μŠ€λŸ¬μš΄ μ›” 지정
    • 1월을 0으둜 ν‘œν˜„
  • 일관성 μ—†λŠ” μš”μΌ μƒμˆ˜
    • μΌμš”μΌμ΄ 0 ν˜Ήμ€ 1 둜 μ‚¬μš©ν•˜λŠ” 객체에 따라 λ‹€λ₯΄λ‹€.
  • Date 와 Calendar 객체의 μ—­ν™œλΆ„λ‹΄
    • λ…„/μ›”/일 계산은 Date 클래슀만으둜 λΆ€μ‘±
    • Calendar 객체λ₯Ό μƒμ„±ν•˜κ³  Date 객체λ₯Ό μƒμ„±ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό 거치기 λ•Œλ¬Έμ— μƒμ„±λΉ„μš©μ΄ λΉ„μ‹Έλ‹€
  • java.util.Date 의 ν•˜μœ„ 클래슀 문제
    • μ˜€ν”ˆμ†ŒμŠ€ 라이브러리 joda.time μ‚¬μš©μ„ μΆ”μ²œ

방어적 볡사본

Effective Java 3rd μ—μ„œλŠ” μ μ‹œμ— 방어적 볡사본을 λ§Œλ“€λΌ 라고 λͺ…μ‹œλ˜μ–΄ 있으며 λ‹€μŒμ€ μ‚¬μš©μ˜ˆλ₯Ό 보여쀀닀.

public Period(Date start, Date end) {
  this.start = new Date(start.getTime());
  this.end = new Date(end.getTime());

  if (this.start.compareTo(this.end) > 0) {
    throw new IllegalArgumentException(this.start + " after " + this.end);
  }
}

μ΄λŠ” λ§€κ°œλ³€μˆ˜κ°€ Date 처럼 제 3μžμ— μ˜ν•΄ ν™•μž₯될수 μžˆλŠ” νƒ€μž…μ΄λΌλ©΄ 방어적 볡사본을 λ§Œλ“€λ•Œ clone() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œλŠ” μ•ˆλœλ‹€.

LocalDate, LocalTime, LocalDateTime Java SE 1.8+

μ΄λŸ¬ν•œ 문제λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ Java SE 8 μ—μ„œλŠ” LocalDate, LocalTime, LocalDateTime μ΄λΌλŠ” 클래슀λ₯Ό λ§Œλ“€μ—ˆλ‹€.

μ‚¬μš©λ²•

// ν˜„μž¬ λ‚ μ§œ 정보
LocalDate currentDate = LocalTime.now();

// λ…„/μ›”/일
LocalDate myDate = LocalDate.of(int year, int month, int dateOfMonth);
// ν˜„μž¬ μ‹œκ°μ„ λ¬Έμžμ—΄λ‘œ λ³€ν™˜
LocalDateTime.now().format(DatetimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

// λ¬Έμžμ—΄μ„ LocalDateTime 으둜 λ³€ν™˜
LocalDateTime.parse().format("2019-12-11 10:15:30", DatetimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));