230608_ 호텔 예약 프로젝트2

hoy_·2023년 6월 8일
0

Today, I Learned

목록 보기
15/36

1. 오늘의 일정

  1. 입력 부분 예외처리 및 코드 다듬기




2. 배운 내용

  1. 날짜 양식으로 지난 날 입력받지 않게 하기.

  2. Calendar로 입력한 년도에 해당하는 달, 주, 일, 요일 가져오기




3. 발생한 오류

  1. 전화번호 입력 예외처리
while (true) {
                System.out.print("\n전화번호를 입력해주세요. : ");
                phoneNum = sc.nextLine().trim();
                String pattern = "^\\d{2,3}-\\d{3,4}-\\d{4}$";
                if (!(Pattern.matches(pattern, phoneNum))) {
                    System.out.println("올바른 휴대전화 형식이 아닙니다. ");
                } else {
                    break;
                }
            }

번호 양식을 정규식으로 지정해 이에 맞는지 확인한다.

  1. 지불할 금액에 대한 예외처리
while (true) {
                try {
                    System.out.print("\n소지금을 입력해주세요. : ");
                    long money = sc.nextLong();
                    if (money < selectedRoom.getRoomPrice()) {
                        System.out.println("소지금이 부족하여 이용이 불가능합니다.");
                        Main.base();
                        break;
                    } else {
                        break;
                    }
                } catch (InputMismatchException i) {
                    System.out.println("잘못된 입력입니다.");
                    System.out.println("다시 입력해주세요.");
                    sc.nextLine();
                }
            }

숫자 외의 입력을 거부한다. 입력을 String 타입으로 받아 해결할 수도 있다.

  1. 지나간 날짜 입력하지 못하게 하는 예외처리
Calendar cal = Calendar.getInstance();
                LocalDate nowYear = LocalDate.now();
                DateTimeFormatter formatterYear = DateTimeFormatter.ofPattern("yyyy");
                int thisYear = Integer.parseInt(nowYear.format(formatterYear));

                LocalDate nowMonth = LocalDate.now();
                DateTimeFormatter formatterMonth = DateTimeFormatter.ofPattern("MM");
                int thisMonth = Integer.parseInt(nowMonth.format(formatterMonth));

                LocalDate nowDay = LocalDate.now();
                DateTimeFormatter formatterDay = DateTimeFormatter.ofPattern("dd");
                int thisDay = Integer.parseInt(nowDay.format(formatterDay));

입력 받은 날짜가 이미 지나있을 경우 다시 입력 받게 하였다.
LocalDate로 년, 월, 일 객체를 할당해 format지정, if문으로 비교하는 방식이었는데 Calendar 클래스에 대한 이해도가 낮아서 중복 코드도 많고, 보기 지저분하다.

다만 기능적으로는 문제 없이 돌아가고 입력한 년, 월에 따라 요일과 일이 보이게 작성한 부분이 마음에 든다.

int end = cal.getActualMaximum(Calendar.DATE); //해당 월 마지막 날짜
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); //해당 날짜의 요일(1:일요일 … 7:토요일)

//

if (!(thisDay <= day && day <= end)) {
                            System.out.println("잘못된 입력입니다."); 
                            // 현재 날짜와 마지막 날짜 사이에 위치하는지 비교

cal.getActualMaximum(Calendar.DATE)로 달의 마지막 날짜를 가져와 그 이상 입력할 수 없게 구현했다.






4. 앞으로의 나는

  1. 지금으로선 아예 사용되지 않는 클래스마저 존재하고 변수와 메서드가 중구난방 위치해 보기 불편하다. 함께 작성하지 않은 누군가가 본다면 분명 빠른 시간에 이해할 수는 없을 것이다.
  2. 그럼에도 구현 완성에 초점을 두기로 했다. 전에는 시간이 모자라 하지 못했던 예외처리를 할 수 있었고 조금 더 심도 있는 기능 구현에 성공했다. 제출까지는 시간이 있으니 로직을 더 깔끔히 할 방법을 팀원들과 고민해보기로 했다.
profile
배우는 사람

0개의 댓글