이번 글에서는 두 개의 int 배열을 받아서 배열이 나타내는 날짜를 비교하는 방법을 다룹니다. 두 배열은 [year, month, day] 형태로 구성되어 있으며, 첫 번째 배열이 두 번째 배열보다 앞선 날짜일 경우 1을 반환하고, 그렇지 않으면 0을 반환하는 메서드를 작성해보겠습니다.
질문과 예시를 통해 먼저 문제를 정의한 다음, 잘못된 접근 방식과 이를 수정한 올바른 접근 방식을 설명하겠습니다.
질문: 두 날짜 비교하기
Java에서 다음과 같은 두 날짜 배열을 비교하는 메서드를 작성하고자 합니다. 조건은 다음과 같습니다:
- 배열 arr1이 배열 arr2보다 앞선 날짜라면 1을 반환하고, 그렇지 않으면 0을 반환합니다.
- 단, if문만을 사용해서 비교해야 합니다.
예시
int[] arr1 = {2023, 11, 28};
int[] arr2 = {2023, 11, 29};
System.out.println(compareDates(arr1, arr2)); // 출력: 1
정답: 두 날짜 배열을 비교하는 코드
public class DateCompare {
public static int compareDates(int[] arr1, int[] arr2) {
// 연도 비교
if (arr1[0] < arr2[0]) {
return 1;
} else if (arr1[0] > arr2[0]) {
return 0;
}
// 월 비교
if (arr1[1] < arr2[1]) {
return 1;
} else if (arr1[1] > arr2[1]) {
return 0;
}
// 일 비교
if (arr1[2] < arr2[2]) {
return 1;
} else {
return 0;
}
}
public static void main(String[] args) {
int[] date1 = {2023, 10, 31};
int[] date2 = {2023, 11, 1};
System.out.println(compareDates(date1, date2)); // 출력: 1
}
}
위 코드에서는 arr1과 arr2의 연도, 월, 일을 순차적으로 비교합니다.
- 연도 비교: arr1[0]이 arr2[0]보다 작으면 arr1이 더 이른 날짜이므로 1을 반환합니다. 크면 0을 반환합니다.
- 월 비교: 연도가 같을 때만 월을 비교합니다. arr1[1]이 arr2[1]보다 작으면 1을, 크면 0을 반환합니다.
- 일 비교: 연도와 월이 같은 경우, 일자를 비교하여 arr1[2]가 arr2[2]보다 작으면 1, 크거나 같으면 0을 반환합니다.
이 코드에서는 입력된 두 날짜 배열을 순차적으로 비교하며 조건에 맞게 if문만 사용하여 작동합니다.
예외와 잘못된 접근 방식: 독립적인 조건 비교가 왜 틀렸는가?
잘못된 접근 방식은 아래와 같습니다:
if (arr1[0] < arr2[0]) {
return 1;
} else if (arr1[1] < arr2[1]) {
return 1;
} else if (arr1[2] < arr2[2]) {
return 1;
} else {
return 0;
}
이 방법은 연도 → 월 → 일의 순서를 확인하지 않고 각 조건을 독립적으로 비교합니다. 이 접근 방식의 문제점은 다음과 같습니다:
- 순차적 비교가 누락됨: else if 구문을 통해 arr1[1] < arr2[1] 또는 arr1[2] < arr2[2]을 확인하게 되면, 연도나 월이 같지 않아도 일(day) 조건을 비교할 수 있습니다. 예를 들어, 연도가 다르거나 월이 다를 때, 잘못된 결과가 반환될 수 있습니다.
- 잘못된 조건 흐름: 연도, 월, 일의 비교는 각각이 독립적이 아니라 순차적으로 연결되어 있어야 합니다. 그렇지 않으면 연도와 월이 같은지를 확인하기 전에 일을 비교할 가능성이 생깁니다.
예외 상황 예시: 잘못된 코드로 인한 오류 발생
예를 들어, 다음과 같은 두 날짜가 있을 때를 살펴보겠습니다:
int[] arr1 = {2023, 10, 31};
int[] arr2 = {2023, 11, 1};
이 경우 arr1은 arr2보다 앞선 날짜이므로 올바른 결과는 1입니다. 그러나 잘못된 코드에서는 arr1[0] == arr2[0] (연도가 같음)을 확인하지 않은 상태에서 arr1[1] < arr2[1] 조건을 독립적으로 비교합니다. 이로 인해 잘못된 조건 흐름이 발생하고, 1을 반환하게 됩니다.
정리
두 날짜 배열을 비교할 때는 날짜 구성 요소인 연도, 월, 일의 순차적 비교가 필요합니다. 이를 위해 각 조건을 중첩하여 비교하면 올바른 결과를 얻을 수 있습니다.
'Programing > JAVA' 카테고리의 다른 글
Java의 Arrays.stream(), map(), toArray()를 이용한 배열 처리 방법 (0) | 2024.10.24 |
---|---|
URL 예약어와 URL 인코딩: 웹 개발자를 위한 필수 가이드 (0) | 2024.08.22 |
Java 애플리케이션을 데몬으로 실행하기: Apache Commons Daemon과 jsvc 사용법 (0) | 2024.06.27 |
Apache Commons Daemon으로 데몬 서비스 구현하기 (0) | 2024.06.27 |
함수형 인터페이스와 람다 표현식으로 코드 간편하게 작성하기 (0) | 2024.02.03 |