강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

진우님의 프로필 이미지
진우

작성한 질문수

김영한의 실전 자바 - 중급 1편

문제와 풀이1

날짜/ 시간 클래스 질문 서포터즈님들 답변좀요 ㅠ

작성

·

98

·

수정됨

0


[질문 내용]
여기에 질문 내용을 남겨주세요.

 

package time.test;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.Scanner;

public class TestCalendarPrinter {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        String[] dayOfWeeks = {"SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"};


        System.out.print("년도를 입력하세요: ");
        int year = scanner.nextInt();
        System.out.print("월을 입력하세요: ");
        int month = scanner.nextInt();

        LocalDate ldt = LocalDate.of(year, month, 1);

        int lastDay = ldt.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth();
        System.out.println("lastDay = " + lastDay);

        String firstDayOfWeek = String.valueOf(ldt.getDayOfWeek());


        System.out.println("Su Mo Tu We Th Fr Sa");

        int count = 0;



        for(int day=1; day<=lastDay; day++){

            if(day == 1) {
                for (String dayOfWeek : dayOfWeeks) {
                    if (dayOfWeek.equals(firstDayOfWeek)) {
                        System.out.print(" " + 1);
                        break;
                    }
                    System.out.print("  ");
                    System.out.print(" ");
                    count++;
                }
                System.out.print(" ");
                continue;
            }

            if(1<day&&day<10){

                if(dayOfWeeks[0].equals(String.valueOf(LocalDate.of(year, month, day).getDayOfWeek()))){
                    System.out.println();
                }
                System.out.print(" "+day);


            }else{

                if(dayOfWeeks[0].equals(String.valueOf(LocalDate.of(year, month, day).getDayOfWeek()))){
                    System.out.println();
                }
                System.out.print(day);

            }

            System.out.print(" "); //요일마다 한 칸 공백


        }
        
    }


}

달력문제 코드로 직접 구현해봤고, 답은 잘 나오는데 너무 뭔가 코드가 깔끔하지 않고, 지저분한 거 같은데, 별로같나요?

갈길이 먼거 같네요. 이런 상황에서 어떻게 스스로 리팩토링 하나요..? 강의는 날짜/시간 클래스 여기까지 배워서 뭐 스스로 리팩토링 하는 방법도 모르겠는데 그냥 진도 쭉쭉 나가면서 공부하다보면 자연스레 깨닫게 될까요?

뭐 지금 날짜/시간 연습문제 포함, 기초편부터 현재 진도까지 모든 연습문제를 답지 안보고 스스로 1~3문제 빼곤 다 풀었는데, 코드가 지저분하고 시간이 좀 오래 걸린게 마음에 걸리긴 합니다.

서포터즈님들의 답변 궁금합니다..

답변 2

0

안녕하세요. 진우님, 공식 서포터즈 David입니다.

코드리뷰의 경우 ChatGPT, Claude 등의 생성형 AI 도움을 받아보시길 권장합니다.

무료 버전에서도 충분히 좋은 피드백을 받으실 수 있으시 참고해 주세요:)

코드리뷰, 리팩토링에 대한 키워드를 넣어서 코드에 대한 피드백을 요청하시면 좋을 것 같아요.

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 진우님.

작성하신 코드에서 깔끔함을 추구하는 것은 좋은 접근입니다. 코드의 가독성을 높이고 유지 보수가 쉬운 코드를 작성하는 것은 매우 중요합니다. 아래에서 도움이 될 만한 몇 가지 리팩토링 팁을 드리겠습니다:

  1. 상수 및 배열 사용 개선: 배열 dayOfWeeks가 잘못된 요소(‘THURSDAY’ 중복 포함)를 갖고 있습니다. 이를 수정하시기 바랍니다.

  2. 변수명 개선: ldt라는 변수명 대신 firstDayOfMonth 같은 더 직관적인 이름을 사용하면 읽기 쉬워집니다.

  3. 중복된 코드 제거: 빈 공백을 출력하는 부분이나, 주말을 확인하는 조건이 중복되어 있네요. 이를 함수로 묶어서 반복을 줄일 수 있습니다.

  4. 출력 형식 일관성 유지: 날짜를 한 자리 수와 두 자리 수로 구분하여 출력하는 부분의 코드를 하나의 작은 메서드로 추출하면 더 깔끔해질 수 있습니다.

  5. 함수 분리: 특별히 복잡한 동작을 끊어서 작은 단위 함수로 분리하는 것이 좋습니다. 예를 들어, 공백을 출력하는 로직, 달력 출력 로직 등을 여러 메서드로 나누면 가독성이 올라갑니다.

해당 코드는 Java DateTimeFormatter를 사용하여 날짜 값을 형식화하는 방법을 추가적으로 학습하면 코드가 더욱 깔끔해질 것입니다.

이러한 리팩토링 경험은 실전에서 부딪히며 배우는 것이 가장 효과적입니다. 현재 수준에서 적정선을 찾고, 실력을 기르면서 자연스럽게 코드를 개선할 수 있게 될 것입니다.

관련 질문과 답변 예시를 참고하시어 더 많은 정보와 팁을 얻을 수 있습니다. 이 링크는 코드 작성에 있어 날짜 사용의 세부 사항 및 포맷팅에 대한 예시를 제공하고 있습니다.

저는 진우님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

진우님의 프로필 이미지
진우

작성한 질문수

질문하기