언어 및 도구들 공부/Java

Java에서 HOUR 과 HOUR_OF_DAY의 차이

Dr.Mlem 2024. 9. 26. 13:14

Q1.

(소스코드는 kr.SteveK.helpers.DatePrinter; 파일과 실습 27-03 날짜 연산)

여기서,  
cal.add(Calendar.HOUR_OF_DAY, 9); 부분에서 HOUR_OF_DAY를 HOUR로 해도 차이가 없는건가?


 

네, cal.add() 메서드를 사용할 때 Calendar.HOUR_OF_DAY 대신 Calendar.HOUR를 사용해도 결과에는 큰 차이가 없습니다. 두 필드는 모두 시간 구성 요소를 나타내며, 시간을 추가할 때 Calendar 클래스가 날짜와 시간을 적절히 조정하여 처리합니다.

이유는 다음과 같습니다:

  • Calendar.HOUR_OF_DAY (0-23): 24시간 형식의 시간을 나타냅니다.
  • Calendar.HOUR (0-11): 12시간 형식의 시간을 나타내며, Calendar.AM_PM 필드와 함께 사용됩니다.

예를 들어, 현재 시간이 오후 11시(23시)이고 2시간을 추가한다고 가정하면:

  • Calendar.HOUR_OF_DAY를 사용하면:
    • HOUR_OF_DAY가 11에서 2를 더해 13이 되며, 이는 다음 날 오전 1시로 넘어갑니다.
  • Calendar.HOUR를 사용하면:
    • HOUR가 (11 + 2) % 12 = 1이 되고, AM_PM 필드가 PM에서 AM으로 변경되어 결과적으로 다음 날 오전 1시가 됩니다.

두 경우 모두 최종 시간은 동일합니다.

결론:

Calendar.HOUR_OF_DAY와 Calendar.HOUR는 시간의 표현 방식(24시간제 vs 12시간제)에 차이가 있지만, cal.add()를 사용하여 시간을 추가할 때는 Calendar 클래스가 시간 필드와 오버플로우를 관리하므로 결과적으로 동일한 시간이 됩니다. 따라서 이 상황에서는 어느 필드를 사용하든 결과에 영향을 주지 않습니다.



Q2.
HOUR과 HOUR_OF_DAY는 표현 방식의 차이일 뿐이지, 값 그 자체에 대해서는 차이가 없다는거야?



아니요, HOUR와 HOUR_OF_DAY는 단순히 표현 방식만 다른 것이 아니라, 실제로 저장되는 값 자체가 다릅니다. 두 필드는 Calendar 객체 내에서 서로 다른 필드를 나타내며, 각기 다른 범위와 의미를 가지고 있습니다.

필드의 차이점:

  • Calendar.HOUR_OF_DAY (0-23): 24시간 형식의 시간으로, 자정부터 시작하여 밤 11시까지 0에서 23까지의 값을 가집니다.
  • Calendar.HOUR (0-11): 12시간 형식의 시간으로, 자정과 정오를 기준으로 0에서 11까지의 값을 가집니다. 이 필드는 Calendar.AM_PM 필드와 함께 사용되어 오전과 오후를 구분합니다.

예시를 통해 설명:

현재 시간이 **오후 3시(15시)**라고 가정하면:

  • cal.get(Calendar.HOUR_OF_DAY)는 15를 반환합니다.
  • cal.get(Calendar.HOUR)는 3을 반환합니다.
  • cal.get(Calendar.AM_PM)는 Calendar.PM을 반환합니다.

따라서 두 필드는 실제로 다른 값을 저장하고 있으며, 단순히 표현 방식만 다른 것이 아닙니다.

시간 추가 시의 동작:

cal.add() 메서드를 사용할 때 Calendar.HOUR_OF_DAY나 Calendar.HOUR를 통해 시간을 추가하면, Calendar 클래스는 내부적으로 필요한 조정을 수행하여 정확한 결과를 제공합니다.

  • cal.add(Calendar.HOUR_OF_DAY, 9)를 사용하면:
    • 현재 시간에 9시간을 직접 추가합니다.
  • cal.add(Calendar.HOUR, 9)를 사용하면:
    • 현재 시간의 12시간 형식인 HOUR 필드에 9를 더하고, 필요하면 AM_PM 필드를 변경하여 오전/오후를 조정합니다.

두 경우 모두 최종 결과적으로 캘린더 객체에 9시간이 추가되지만, 내부적으로는 다른 필드가 변경됩니다.

결론:

  • 값의 차이: HOUR와 HOUR_OF_DAY는 실제로 다른 값을 가지며, 단순히 표현 방식의 차이가 아닙니다.
  • 사용 시 주의사항: 시간을 추가하거나 계산할 때 두 필드를 혼용하면 혼란이 발생할 수 있으므로, 일관된 시간 형식을 사용하는 것이 좋습니다.
  • 하지만 추가 시 결과는 동일: cal.add() 메서드를 사용할 때는 Calendar 클래스가 내부적으로 필드 간의 관계를 관리하므로, 두 필드를 사용하여 시간을 추가해도 최종 결과는 동일하게 됩니다.

따라서, HOUR와 HOUR_OF_DAY는 표현 방식뿐만 아니라 값 자체에서도 차이가 있습니다. 그러나 시간을 추가할 때는 Calendar 클래스가 이를 적절히 처리하므로, 두 필드를 사용하여 시간을 추가해도 결과적으로 같은 시간이 됩니다.



Q3.
즉, 설정된 시간을 변경할 때에 HOUR에 더하든, HOUR_OF_DAY 로 더하든 상관 없다는거지?



네, 시간을 변경할 때 Calendar.HOUR나 Calendar.HOUR_OF_DAY에 시간을 더해도 결과적으로 동일한 시간이 설정됩니다. Calendar 클래스는 내부적으로 시간 필드 간의 관계를 관리하므로, 두 필드를 사용하여 시간을 추가하면 필요한 조정이 자동으로 이루어집니다.

상세 설명:

  • Calendar.HOUR_OF_DAY (0-23): 24시간 형식의 시간 필드로, 자정부터 시작하여 밤 11시까지의 시간을 나타냅니다.
  • Calendar.HOUR (0-11): 12시간 형식의 시간 필드로, 오전과 오후를 구분하기 위해 Calendar.AM_PM 필드와 함께 사용됩니다.

시간을 추가할 때:

  • cal.add(Calendar.HOUR_OF_DAY, n)를 사용하면:
    • 24시간 형식의 시간에 n시간을 직접 추가합니다.
  • cal.add(Calendar.HOUR, n)를 사용하면:
    • 12시간 형식의 시간에 n시간을 추가하고, 필요한 경우 AM_PM 필드가 자동으로 변경됩니다.

두 경우 모두 Calendar 객체는 내부적으로 필드들을 조정하여 정확한 시간 계산을 수행합니다. 따라서 시간을 추가할 때 어느 필드를 사용하든 최종 결과에는 차이가 없습니다.

그러나 주의할 점:

  • 일관성 유지: 코드의 가독성과 유지보수를 위해서는 하나의 시간 형식을 일관되게 사용하는 것이 좋습니다.
  • 명확성: 24시간제를 사용하고 있다면 Calendar.HOUR_OF_DAY를 사용하는 것이 직관적이며 오류를 줄일 수 있습니다.
  • 필드 접근: 시간 값을 직접 가져오거나 설정할 때는 필드의 차이를 이해하고 사용해야 합니다. 예를 들어, 현재 시간이 오후 3시(15시)일 때:
    • cal.get(Calendar.HOUR_OF_DAY)는 15를 반환합니다.
    • cal.get(Calendar.HOUR)는 3을 반환하고, cal.get(Calendar.AM_PM)는 Calendar.PM을 반환합니다.

결론:

  • 시간 추가 시: HOUR와 HOUR_OF_DAY 중 어느 것을 사용하든 시간을 변경하는 데에는 상관없습니다.
  • 코드 작성 시: 프로젝트나 팀에서 사용하는 시간 형식에 따라 적절한 필드를 선택하는 것이 좋습니다.
  • 이해와 관리: 두 필드의 차이와 동작 방식을 이해하면 더욱 정확하고 효율적인 코드 작성을 할 수 있습니다.

따라서, 설정된 시간을 변경할 때 HOUR에 더하든 HOUR_OF_DAY에 더하든 결과에는 상관이 없습니다. Calendar 클래스가 내부적으로 이를 처리하여 정확한 시간을 제공합니다.

'언어 및 도구들 공부 > Java' 카테고리의 다른 글

DAY_OF_MONTH, DAY_OF_WEEK  (0) 2024.09.26
cal.getActualMaximum(Calendar.WEEK_OF_MONTH);  (1) 2024.09.26
메소드 자체를 값처럼 쓰기  (0) 2024.09.26
package, import 순서  (0) 2024.09.25
super()있어야 하나? 2  (1) 2024.09.24