Java/[inflearn] 자바 중급(1)

[김영한_자바중급][6. 날짜와 시간] 예제를 통한 이해 (p.45)

줌인. 2024. 4. 1. 16:09

[p.45 / 예제2) 선생님 코드_좋은 코드]

public class TestLoopPlus {

    public static void main(String[] args) {
        LocalDate startDate = LocalDate.of(2024,1,1);
        for (int i = 0 ; i < 5 ; i++) {
            LocalDate nextDate = startDate.plus(i*2, ChronoUnit.WEEKS);
            System.out.println("날짜 " + (i+1) + " : " + nextDate);
        }
    }
}

2번 코드는 반복문 안에서 직접 날짜를 계산하므로 코드가 더 간단하고 직관적이다.

추가적인 요구사항이나 변경 사항이 발생해도 코드를 쉽게 수정할 수 있다.

 

[p.45 / 예제2) 내가 작성한 코드]

public class TestLoopPlus {

    public static void main(String[] args) {
        LocalDate now = LocalDate.of(2024, 1,1);
        //2주 간격 --> 14일

        for (int i = 1 ; i <= 5 ; i++) {
            if(i!=1) {
                now = now.plusDays(14);
                System.out.println("날짜 " + i + " : " + now);
                continue;
            }
            System.out.println("날짜 " + i + " : " + now);
        }

    }
}

- 단순하게 생각

 

  내가 작성한 코드 선생님 작성 코드
장점 - 일반적인 plusDays 메서드 사용으로
  직관적이고 이해하기 쉬움
-  원본 날짜(now)를 변경하지 않고 
   계산된 날짜를 별도의 변수에 저장해가
   가독성이 좋음
- plus 메서드를 사용하여 간격을 직접 지정한
  간결한 코드
- ChronoUnit을 활용하여 시간 단위를 명시적
   표현으로 가독성이 좋음
단점 - 반복문 내에 조건문을 사용하는 코드가
 혼재되어 있어 가시성이 약간 떨어짐
- 반복문 내 now 변수 재할당으로
  원본 날짜가 변경됨
  (원본 날짜 유지 어려움)
결론   ∴ 가시화 / 유연성이 더 높음

 

 


 

 

[p.45 / 예제2) 내가 처음 작성한 코드_좋지 않은 코드]

import java.time.LocalDate;
public class TestLoopPlus {

    public static void main(String[] args) {
        LocalDate ld = LocalDate.of(2024, 1, 1);
        LocalDate [] lds = new LocalDate[5];
        for (int i = 0; i < lds.length ; i++) {
            if(i != 0) {
                lds[i] = lds[i-1].plusDays(14);
                System.out.println("날짜 " + i + ": " + lds[i]);
            } else {
                lds[i] = ld;
                System.out.println("날짜 " + i + ": " + lds[i]);
            }
        }
    }
}

- 상기코드가 동작은 되지만, 배열을 사용하여 날짜를 저장하고 처리하기 때문에 코드가 조금 더 복잡해졌다. 

  또한 배열의 크기를 변경하거나 다른 조건을 추가하려면 코드를 수정해야 한다. 

  ∴ 유연성이 부족한 코드다.

 

해당 코드 접근 계기
1) 2주 간격으로 증가한다. ⇒ .plusDays(14)를 코드별로 반복하면 되겠다.
2) 반복한다면, 하기와 같이 작성될 것이다.
LocalDate ld2 = ld.plusDays(14);
LocalDate ld3 = ld2.plusDays(14);
LocalDate ld4 = ld3.plusDays(14);
LocalDate ld5 = ld4.plusDays(14);
System.out.println("날짜 2 : " + ld2);
System.out.println("날짜 3 : " + ld3);
System.out.println("날짜 4 : " + ld4);
System.out.println("날짜 5 : " + ld5);
3) 그렇다면 배열에 담아서, 이러한 반복을 최소화 해보자
4) 배열에 어떻게 담으면 좋을까?
⇒ ld[i] = ld[i-1].plusDays(14) 구조로 들어간다면, 배열로 담을 수 있겠구나
5) 근데 상기 배열 처럼 담을경우 0은 출력못하니 0은 if문으로 별도 작성하자
⇒ ld[0] = ld
728x90