10월 25일

Yullgiii·2023년 10월 25일
0
post-thumbnail

내일 배움 캠프

오늘도 협업 2일차 과연 우리는 모든 기능을 구현할수있을까?
혼자 밤샘하는것보다 느린거 같지만 함께함으로서 여유가 생기는건 팩트니까!!!
그렇게 우리는 한발자국씩 나가면 되는것 아니겠는가?

호텔 예약 관리 시스템

현재는
1.실행로직 나누기
2.그걸 기준으로 스캐너 나누기
3.금액빼기
4.객실별 가격표기해주기
5.실행중 틀리면 바로 돌아오거나 뒤로 돌아오기
6.꾸미기
의 일정이 남아서 각자 분담을 하고 작업을 하기로 헀다.
그래서 내가 작업할 분량을 작업할것이다!

날짜 입력 형식 지정해주기!

    private static String inputDateInfo(Scanner sc) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        System.out.print("예약 날짜를 입력하세요 (예, 2023-11-01): ");
        while(true) {
            String inputDate = sc.nextLine();
            try {
                LocalDate.parse(inputDate, formatter); // 형식에 맞는지 검사
                return inputDate;
            } catch (DateTimeParseException e) {
                System.out.print("날짜 형식이 일치하지 않습니다. 다시 입력해주세요 (예, 2023-11-01): ");
            }
        }
    }

이친구를 추가해주면서 이제 형식에 이게 맞는지 아니면 틀린지를 검사할수있는 메서드를 정의해줬다.
이렇게 하면 날짜가 형식이 틀리면 틀렸다고 나올걳이다...
근데 이렇게 헀는데
예약을 과거날짜를 입력하면 마지막에 와서야 왜!예약날짜가 과거라고 하는거지???젠장...

        while(true) {
            System.out.print("예약 날짜를 입력하세요 (예, 2023-11-01): ");
            String inputDate = sc.nextLine();
            try {
                LocalDate chosenDate = LocalDate.parse(inputDate, formatter); // 형식에 맞는지 검사
                if(chosenDate.isBefore(currentDate)) {
                    System.out.println("당신은 타임머신타려고요? 지난 날짜는 예약 안돼요~.");
                    continue; // 과거의 날짜를 입력하면 다시 입력 요청
                }
                return inputDate;
            } catch (DateTimeParseException e) {
                System.out.print("날짜 형식이 일치하지 않습니다. 다시 입력해주세요 (예, 2023-11-01): ");
            }
        }
    }

그래서 이런식으로 변경을 해주니 작업이 끝나버렸어...허허

하찮은 꾸미기!

    private static void printMenu() {       // 사용자가 선택할 수 있는 메뉴 표시
        System.out.println("\n" + "=".repeat(40));  // '====...====' 패턴으로 상단 테두리 추가
        System.out.println("     AAA Hotel에 오신 것을 환영합니다!");
        System.out.println("=".repeat(40));         // '====...====' 패턴으로 하단 테두리 추가
        System.out.println();
        System.out.println("1. 예약하기       - 호텔의 빈 방을 예약할건데 굉장히 환영해요");
        System.out.println();
        System.out.println("2. 예약 취소하기   - 이미 예약한 방을 취소하시려고요...?");
        System.out.println();
        System.out.println("3. 나의 예약 보기  - 예약 정보는 확인하셔야죠?");
        System.out.println();
        System.out.println("4. 종료            - 시스템을 종료합니다.");
        System.out.println();
        System.out.println("0. 모든 예약 보기 (관리자) - 와서 뭐하시려고요...?");
        System.out.println();
        System.out.print("원하는 번호를 선택해주세요: ");
    }

처음 보이는 부분이 중요하니까 이런식으로 꾸며놔봤다!
이제는 각자 코드를 보다가 마음에 안드는 부분을 서로 의논하여 수정작업하기로 하며
어느정도 팀프로젝트의 끝이 다가옴을 느꼇다.

고생한 우리팀들의 흔적...다들 정말 고생이 많았다!

키오스크 작업(혼자하는것)

우선 어제 하다가 만 요구사항에서

  • 맨 위에 완료된 최근주문 3개를 출력한다.
  • 그 아래에 대기중인 모든 주문 목록을 출력한다.
  • 주문시 요청사항 메시지를 입력할 수 있습니다. (20자 제한)
    이 있어야하고
    아예 기능하지 않았던것은
    1. 대기주문 목록2. 완료 주문목록의 기능이 구현되지않았었다.
    그래서 팀원들의 의견을 묻던중
    한분의 의견이 결제를 완료를 하면 관리자가 1. 대기주문 목록 에 접근을 해서
    승인을 해줘야지만 2. 완료 주문목록으로 갈수있게끔 하는거 아닐까라는 의견을 주셔서 그것에 문제에 대한 이해가 가기 시작하며 코드를 작성했다!!!!!

Order 클래스

 // 대기 번호를 반환하는 메서드
public int getWaitingNumber() {
        return this.orderId;
    }

    public String getProductListAsString() {
        StringBuilder sb = new StringBuilder();
        for (Product product : this.products) {
            sb.append(product.getName()).append(", ");
        }
        // 마지막 ", " 제거
        if (sb.length() > 0) {
            sb.setLength(sb.length() - 2);
        }
        return sb.toString();
    }
// 주문의 세부 사항을 문자열로 반환하는 메서드
    public String getOrderDetails() {
        StringBuilder details = new StringBuilder();
        details.append("대기 번호: ").append(orderId).append("\n");
        details.append("주문 상품 목록:\n");
        for (Product product : products) {
            details.append("- ").append(product.getName()).append("\n");
        }
        details.append("주문 총 가격: ₩").append(getTotalPrice()).append("\n");
        details.append("요청 사항: ").append(request).append("\n");
        details.append("주문 일시: ").append(formattedOrderTime()).append("\n");
        return details.toString();
    }
    // 주문에 포함된 상품들의 목록을 반환하는 메서드
    public List<Product> getProducts() {
        return this.products;
    }
     // 완료된 주문의 세부 사항을 문자열로 반환하는 메서드
    public String getCompletedOrderDetails() {
        return getOrderDetails() + "완료주문 일시: " + formattedCompletionTime() + "\n";
    }

getWaitingNumber메서드는 주문의 대기 번호(orderId)를 반환하면서 각 주문은 고유한 대기 번호를 가지며, 이를 통해 주문을 구분하고 추적
getProductListAsString메서드는 주문에 포함된 모든 상품의 이름을 연결하여 하나의 문자열로 만들어 주며 상품 이름은 쉼표와 공백(", ")으로 구분시켜줬는데 아 마지막 까지찍히길래 마지막 상품의 뒤에는 쉼표와 공백을 제거하여 결과 문자열을 깔끔하게 만들어 줬다.
getOrderDetails 주문의 모든 세부 사항(대기 번호, 주문 상품 목록, 주문 총 가격, 요청 사항, 주문 일시)을 연결하여 하나의 문자열로 반환하도록 설정해주고 이제 이것들을 쓰러 넘어가야하지 않겠는가? 어디로??당연히 🔽🔽🔽🔽🔽🔽🔽

KioskManager 클래스

    public boolean approvePendingOrder(int orderId) {// 대기 중인 주문 목록을 순회하기 위한 Iterator 객체를 생성
        Iterator<Order> iterator = pendingOrders.iterator();
        while (iterator.hasNext()) {
            Order order = iterator.next();
            // 현재 주문의 ID가 승인하려는 주문의 ID와 일치하는지 확인
            if (order.getOrderId() == orderId) {
           
           // 주문의 완료 시간을 현재 시간
                order.setCompletionTime(new Date());
           
           // 완료된 주문 목록에 해당 주문을 추가
                completedOrders.add(order);
           // 대기 중인 주문 목록에서 해당 주문을 삭제
          		iterator.remove();
                return true;
            }
        }
        // 일치하는 주문 ID를 찾지 못한 경우 false를 반환
        return false;
    }
    public void viewRecentCompletedOrders(int count) {
        System.out.println("\n[ 최근 완료된 주문 ]");
        int displayedCount = 0;
        
        // 완료된 주문 목록의 마지막 부터 순회하기 위한 ListIterator 객체를 생성
        ListIterator<Order> iterator = completedOrders.listIterator(completedOrders.size());
        
        // 아직 표시할 주문이 남아 있고, 지정된 개수만큼의 주문을 표시하지 않았다면 계속 반복
        while (iterator.hasPrevious() && displayedCount < count) {
            Order order = iterator.previous();
            System.out.println("대기번호: " + order.getOrderId());
            System.out.print("상품목록: ");
            
             // 주문에 포함된 상품들의 이름을 순서대로 출력
            for (Product product : order.getProducts()) {
                System.out.print(product.getName() + ", ");
            }
            System.out.println("\n---------------------");
            displayedCount++;
        }
    }

현재 이 메서드는 대기중인 주문목록에서 승인후 완료 주문목록으로 넘기는 역할을 해주는용으로 작성해봤다! 그리고는 최근의 완료된 주문도 메인메뉴화면에 표시를 시켜주는것이다!!!!
각 기능들은 주석으로 다 달아놓았다!!!

Kiosk 클래스

            System.out.println("[ 주문 현황 ]");
            System.out.println(" ");
            kioskManager.viewRecentCompletedOrders(3);
            System.out.println(" ");
            kioskManager.viewPendingOrders();
            System.out.println(" ");

위의 부분은 이제 본격적으로 인터페이스에서 역할을 하는거니까 일명..꾸미기 이다...

 switch (choice) {
                case 1:
                    viewPendingOrders();
                    System.out.println("승인할 주문의 대기 번호를 입력하세요: ");
                    int orderId = scanner.nextInt();
                    if (kioskManager.approvePendingOrder(orderId)) {
                        System.out.println("주문이 승인되었습니다.");
                    } else {
                        System.out.println("주문 번호를 찾을 수 없습니다.");
                    }

이거는 위에서 지정한 KioskManager 클래스를 사용하기위한 부분이다!!!!

switch (choice) {
            case 1:
                System.out.print("요청사항을 입력해주세요(없으면 없음을 입력해주세요, 20자 제한): ");
                String requestMessage = scanner.nextLine().substring(0, Math.min(scanner.nextLine().length(), 20));
                totalSales += total;

이녀석은 요청사항을 받아주는 곳이렸다~!!!

이렇게 팀과제였지만 어찌보면 개인과제가 되어버린 키오스크 매니저 프로그램도 완성을 해주었다!!!!
깃이 없어서 내맘대로 푸쉬할수있음에 편함과 동시에 뭔가 싱기하다...
이렇게 마무리하기에는 너무도 보기에 불편한 코드이지만 그래도 이정도면 만족할수있지않을까?

심화반 수업

객체지향

  • 내가 한 코드가 아니더라도 수정할수 있어야함
  • 쉽게 읽기 위함 + 코드의 재사용성을 높이기 위해서!
    이름이 어려워서 그렇지 그냥 역할놀이 시키는것이다!

객체란?

클래스 ,변수 ,메소드, 등등 여러가지를 나타네는 것이다. 그냥 그것!그것은 다 객체여!!!!
여기서는 객체에대해서 동물정의 해주시면서 얼굴,다리,행위등을 설명해주셨는데
내가 생각하는 객체는 장기이다. 인간이 인간의 역할을 하기위해선 장기가 필요한데 그 장기들이 모여 하나의 코드가 되는 장기의 역할을 하는것이라고 생각하고 있다.
튜터님이 말하시길 각 개발자마다 느끼는 객체의 느낌이 있다고했으니 내가 느끼는 느낌으로 이해를 하는게 맞지않을까?

객체지향의 특징

추상화, 캡슐화(내가 젤좋아하는거) 상속, 다향성
추상화를 해두면 같은역할을 가지는 것끼리 모은다는 것이니 나중에 코드 구현할때 머리가 덜아프다.=>공통된 행위와 속성을 모으는것

캡슐화는 변수와 함수를 하나로 묶는것을 뜻하는데 스르륵 풀어버릴수도 있게끔 만들수도 있다.
그래서 재활용에도 용의하다!!!

상속은 물려주거나 물려받는건데 생각보다 많이 사용되듭디다...?
새로운 클래스에서 다시금 그친구를 스르륵 끌고와서 사용하는것이다!
단점이 쩔어...상위 클래스 변경이 힘들어...다 꼬여버리니께...

다향성은 하나의 이름이 다른의미로 해석될수있는게 다향성인데....뭐 뭔소린지 모르겠어...그렇다고하니 그런거지뭐

회고

내일부터는 개인프로젝트로서 환율계산기를 만들기 해보려고 한다
이걸 진행하다가! 스프링부트를 배워보면서 API를 이용할수있게끔 바꿔보려고 한다!
그렇게 어느정도 개인 팀프로젝트를 모두 마쳤으니까 다른것들을 시작하며 복습도 좀 해야겠다...
너무 바쁘게 하는거 같지만 평일은 좀 바빠도 되지않을까??
고생했고 천천히 꾸준히 나아가자

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글