마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

TextView에 작성한 코드를 더 효율적으로 바꿀 수 있을까요?

0 추천

안녕하세요. 

LinearLayout에 TextView 5개를 넣어두고, 

첫번째 TextView에 오늘날짜를 시작으로 5일치의 날짜가 들어가되, 주말은 제외하고 들어가게 하는 코드를 작성중입니다.

LinearLayout(horizontal) - tv_day1, tv_day2, tv_day3, tv_day4, tv_day5

 

우선 int day 값을 통해 날짜를 구할 수 있는 getCurrentNextDate 메소드를 작성했습니다.

(int day값이 0이면 오늘, 1이면 내일, 2이면 그 다음날 ... 이런식입니다.)

 

Globals.java

// int day 값을 통해 다음날 날짜를 구할 수 있음
    public static String getCurrentNextDate(int day, String dayOfWeek) {
        DateFormat dtf = new SimpleDateFormat(dayOfWeek);

        final Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, day);

        return dtf.format(cal.getTime());
    }

 

후에, TextView에 setText해주는 MainActivity.java에 day값을 넣어주는 메소드 CurrentNextDate를 작성했습니다.

이때 요일(EE)을 기준으로 토요일이거나 일요일이면 그 다음날을 출력하도록 int값을 줬고, 결과적으로는 잘 나오는데 이런 코드는 제가 봤을 때 너무 보기 안좋은 코드 같아서요.

혹시 이 방법 말고 다른 더 효율적인 코드로 작성 하는 방법이 있다면 답변으로 알려주시면 정말 감사드립니다!

혹은 이렇게 코드를 작성해도 괜찮을까요?

 

MainActivity.java

         // 오늘이 토요일이면
        if (Globals.getCurrentNextDate(0, "EE").equals("토")) {
            CurrentNextDate(2, 3, 4, 5, 6);     // 0: 토, 1: 일
        }
        // 오늘이 일요일이면
        else if (Globals.getCurrentNextDate(0, "EE").equals("일")) {
            CurrentNextDate(1, 2, 3, 4, 5);     // 0: 일
        }
        // 내일이 토요일이면
        else if (Globals.getCurrentNextDate(1, "EE").equals("토")) {
            CurrentNextDate(0, 3, 4, 5, 6);     // 1: 토, 2: 일
        }
        // 내일이 일요일이면
        else if (Globals.getCurrentNextDate(1, "EE").equals("일")) {
            CurrentNextDate(0, 2, 3, 4, 5);     // 1: 일
        }
        // 세번째 날이 토요일이면
        else if (Globals.getCurrentNextDate(2, "EE").equals("토")) {
            CurrentNextDate(0, 1, 4, 5, 6);     // 2: 토, 3: 일
        }
        // 세번째 날이 일요일이면
        else if (Globals.getCurrentNextDate(2, "EE").equals("일")) {
            CurrentNextDate(0, 3, 4, 5, 6);     // 1: 토, 2: 일
        }
        // 네번째 날이 토요일이면
        else if (Globals.getCurrentNextDate(3, "EE").equals("토")) {
            CurrentNextDate(0, 1, 2, 5, 6);     // 3: 토, 4: 일
        }
        // 네번째 날이 일요일이면
        else if (Globals.getCurrentNextDate(3, "EE").equals("일")) {
            CurrentNextDate(0, 1, 4, 5, 6);     // 2: 토, 3: 일
        }
        // 다섯번째 날이 토요일이면
        else if (Globals.getCurrentNextDate(4, "EE").equals("토")) {
            CurrentNextDate(0, 1, 2, 3, 4);     // 4: 토, 5: 일
        }
        // 다섯번째 날이 일요일이면
        else if (Globals.getCurrentNextDate(4, "EE").equals("일")) {
            CurrentNextDate(0, 1, 2, 5, 6);     // 3: 토, 4: 일
        }

 

    public void CurrentNextDate(int day1, int day2, int day3, int day4, int day5) {
        tv_day1.setText(Globals.getCurrentNextDate(day1, "M월 dd일 (EE)"));
        tv_day2.setText(Globals.getCurrentNextDate(day2, "M월 dd일 (EE)"));
        tv_day3.setText(Globals.getCurrentNextDate(day3, "M월 dd일 (EE)"));
        tv_day4.setText(Globals.getCurrentNextDate(day4, "M월 dd일 (EE)"));
        tv_day5.setText(Globals.getCurrentNextDate(day5, "M월 dd일 (EE)"));
    }

 

감사합니다.

오이52 (290 포인트) 님이 2022년 3월 17일 질문

1개의 답변

0 추천
 
채택된 답변

getCurrentNextDate()가 좀 이상해 보입니다. 현재 코드는 해당 월의 1, 2, 3, 4, 5일을 구하는 코드이지, 특정 날짜의 +1, +2, +3, +4, +5일을 구하는 코드가 아닌 것 같습니다. 이런 코드는 유닛 테스트를 작성하면 검증이 쉽습니다.

제 생각에는 아래처럼 현재 날짜를 기준으로 날짜를 증가시켜주어야 할 것 같아 보여요.

    public static String getCurrentNextDate(int day, String dayOfWeek) {
        ...
        int dayOfYear = cal.get(Calendar.DAY_OF_YEAR)
        cal.add(Calendar.DAY_OF_YEAR,  dayOfYear + day);
 
        ...
    }

 

그리고 주말을 제외한 5일을 구하는 코드도 유틸리티 함수를 만드시면 되지 않을 까요?

public class Globals {

    public static Calendar getNextDayCalendar(int day) {
        Calendar cal = Calendar.getInstance();
        int dayOfYear = cal.get(Calendar.DAY_OF_YEAR)
        cal.add(Calendar.DAY_OF_YEAR,  dayOfYear + day);
 
        result cal;
    }

    public Date getNextDate(int day) {
         return getNextDayCalendar(day).getTime();
    }

    public String formatDate(Date date, String pattern) {
         DateFormat dtf = new SimpleDateFormat(pattern);
         return dtf.format(date);
    }

    public static boolean isWeekEnd(Calendar cal) {
        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
        return dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY;
    }

    public static List<Date> getNextWeekDays(int days) {
        List<Date> result = new ArrayList<>();

        int i = 1;
        while (result.size() < days) {
             Calendar cal = Globals.getNextDayCalendar(i);
             if (!Globals.isWeekEnd(cal)) {
                   result.add(cal.getTime());
             } 

             i++;
        }

       return result;
    }
}

private static final WEEKDAY_FORMAT = "M월 dd일 (EE)";
private final List<TextView> weekDayViews = Arrays.asListOf(
    tv_day1, tv_day2, tv_day3, tv_day4, tv_day5
)

private void bindNextWeekDays() {
    List<Date> days = Globals.getNextWeekDays(weekDayViews.size());
    for (int i = 0 ; i < weekDaysView.size(); i++) {
          weekDayViews.get(i).setText(getFormattedWeekDay(days.get(i)));
    }
}

private String getFormattedWeekDay(Date date) {
   return Globals.formatDate(date, WEEKDAY_FORMAT);
}

 

Date formatting을 좀 더 깔끔하게 처리하고 싶다면 먼저  Java8의 desugaring을 추가하고
https://developer.android.com/studio/write/java8-support

아래의 Github 코드를 가져다 사용하세요.
https://gist.github.com/dblevins/47f7508e241d775fd7007a4639d6565a

spark (227,830 포인트) 님이 2022년 3월 17일 답변
오이52님이 2022년 3월 17일 채택됨
액티비티에서 유틸리티 메소드를 사용하시는 걸 보니까
cal.add(Calendar.DATE, day);
를 사용하는 것도 맞는 것 같네요. getCurrentNextDate()는 리턴타입말고는 변경없이 사용하셔도 될 듯 해요.
정말 감사합니다. 항상 질문 드리면 덕분에 많은 부분들을 배워갑니다! 감사합니다!
...