dayArray[dayOfWeek-1] 이건 어떻게 해석하나요?

조회수 318회
package sec02.verify.exam02;

import java.util.Calendar;

public class DatePrintExample2 {

    public static void main(String[] args) {

        Calendar now = Calendar.getInstance();

        int year = now.get(Calendar.YEAR);

        int month = now.get(Calendar.MONTH)+1;
        String strMonth = (month<10) ? ("0"+month) : (""+month);

        int dayOfMonth = now.get(Calendar.DAY_OF_MONTH);
        String strDayOfMonth = (dayOfMonth<10)? ("0"+dayOfMonth) : (""+dayOfMonth);

        String[] dayArray = {"일", "월", "화", "수", "목", "금", "토"};
        int dayOfWeek = now.get(Calendar.DAY_OF_WEEK);
        String strDayOfWeek = dayArray[dayOfWeek-1] + "요일";

        int hour = now.get(Calendar.HOUR_OF_DAY);
        String strHour = (hour<10) ? ("0"+hour) : (""+hour);

        int second = now.get(Calendar.SECOND);
        String strSecond = (second<10) ? ("0"+second) : (""+second);

        System.out.print(year + "년 ");
        System.out.print(strMonth + "월 ");
        System.out.print(strDayOfMonth + "일 ");
        System.out.print(strDayOfWeek + " ");
        System.out.print(strHour + "시 ");
        System.out.print(strSecond + "분 ");

      }
    }

여기서 String[] dayArray = {"일", "월", "화", "수", "목", "금", "토"}; 이렇게 배열 선언하고 이 변수 dayArray 안에 다시 리스트 [dayOfWeek-1] 를 대입?하는건 어떻게해석해야하는건지모르겠어요

1 답변

  • nowCalendar입니다. Calendar.get(Calendar.DAY_OF_WEEK)을 하면 DayOfWeek.MONDAY부터 DayOfWeek.SUNDAY 사이의 값 중 하나를 반환합니다. 여기서 DayOfWeek은 Enum입니다.

    Enum

    잠시 Enum에 대해서 설명해보겠습니다. Enum이 무엇인지 알고 계신다면 스킵하셔도 좋습니다.

    Enumenumerable은 '열거체'라는 뜻으로, 쉽게 말하면 상수를 모아 둔 클래스인데요, Enum을 사용하면 코드 작성에 있어서 오류를 줄여 줄 수 있습니다. 예를 들어, Enum 없이 간단한 사칙연산 함수를 만들어 준다고 해 봅시다. 이렇게 만들 수 있겠습니다.

    int eval(int a, int b, char op) throws ArithmeticException {
      if (op == '+') return a + b;
      if (op == '-') return a - b;
      if (op == '*') return a * b;
      if (op == '/') return a / b;
      throw new ArithmeticException();
    }
    

    여기서 우리는 op+-*/ 이외의 문자도 넣을 수 있는 걸 확인할 수 있습니다. eval(1, 2, '=') 같은 줄은 ArithmeticException이 발생해서 크래시가 나겠지만, 실행하기 전까지는 그 누구도 에러가 난다고 알려주지 않습니다.

    함수를 이렇게 바꿔 보겠습니다. op 인자가 Enum이 되었습니다.

    enum Operator { ADD, SUB, MUL, DIV }
    
    int eval(int a, int b, Operator op) throws ArithmeticException {
        if (op == Operator.ADD) return a + b;
        if (op == Operator.SUB) return a - b;
        if (op == Operator.MUL) return a * b;
        if (op == Operator.DIV) return a / b;
        throw new ArithmeticException();
    }
    

    이렇게 바꾸면 코드의 다른 부분에서 eval(1, 2, Operator.ADD)와 같은 식으로 호출할 수 있습니다. op 자리에 들어갈 수 있는 값들은 Operator.ADD, Operator.SUB, Operator.MUL, Operator.DIV뿐이므로 eval 함수를 구현할 때 이 네 가지 경우 이외의 것을 생각할 필요가 없게 됩니다.

    이외의 이점도 많으나, 이런 이점이 있기에 Enum을 사용한다고 보시면 됩니다.

    DayOfWeek

    그래서 now.get(Calendar.DAY_OF_WEEK)의 자료형은 int가 아니고, 약간 특별한 자료형인 DayOfWeek입니다. 아마 int dayOfWeek = now.get(Calendar.DAY_OF_WEEK);은 오류가 날 것 같은데요, 대신 int로 받고 싶다면 getValue() 메서드를 사용하면 됩니다. 아래 예제와 같이 할 수 있습니다.

    int dayOfWeek = now.get(Calendar.DAY_OF_WEEK).getValue();
    

    그런데 공식 문서를 보니 getValue()는 월요일이 1부터 일요일이 7까지 되도록 반환해 준다고 합니다. 이에 맞게 원본 함수를 조금 수정해 줘야겠습니다.

    String[] dayArray = {"월", "화", "수", "목", "금", "토", "일"};
    // dayOfWeek는 월요일이 1, 일요일이 7
    int dayOfWeek = now.get(Calendar.DAY_OF_WEEK).getValue();
    // dayOfWeek - 1은 월요일이 0, 일요일이 6
    String strDayOfWeek = dayArray[dayOfWeek - 1] + "요일";
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)