키오스크(개인 프로젝트) 만들기 시작 : class, join method

김재현·2023년 10월 21일
0

TIL

목록 보기
12/88
post-thumbnail
  • 프로젝트명 : "키오스크 만들기"
  • 프로젝트 소개 : 메뉴판을 보고 주문할 수 있는 Java 프로그램입니다.
  • 사용 기술: #Java
    GitHub: https://github.com/k-jaehyun/Kiosk

    (상세 기능 및 설계는 GitHub 참고 바랍니다.)

메인, 상품 메뉴, 구매, 주문, 주문 완료, 주문 취소로 구성된 키오스크 프로그램 입니다.

  • 화면은 System.out.println() 메소드를 사용해서 심플하게 출력합니다.
  • 메뉴 클래스와 주문 클래스를 사용하여 Java 의 핵심 기능인 상속을 최대한 사용하였습니다.

기능 구현

1. total 클래스 추가해서 전체 주문된 메뉴를 저장!

public class TotalMenu {
    public ArrayList<Product> menuSum;
}
//총 금액 저장 할 값
double totalPrice = 0;

//총 금액 저장
for (Product total : order.orderMenu) {
	totalPrice = totalPrice + total.price;
}

//주문내역이 없으면 다시 메뉴판으로 보낼
if (totalPrice == 0) {
	System.out.println("주문 내역이 없습니다.\n주문을 다시 진행합니다.\n");
	try {
		Thread.sleep(1000);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
}

2. if 문에서 병렬적으로 처리되어 clear되는 문제를 join method로 해결

//이녀석이 제일 먼저 실행되도록 join() 메서드 사용///
{
	Thread yourThread = new Thread(() -> {
		// 스레드가 수행할 작업
		totalMenu.menuSum.addAll(order.orderMenu);
	});

	//스레드 시작
	yourThread.start();
	try {
	// yourThread 스레드가 완료될 때까지 현재 스레드를 일시 중단
		yourThread.join();
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
}

3. 다른 번호 눌렀을 때 번호를 다시 입력하도록 구현

gainChoice1:     //다시 선택 하는 루프 깨기 위해 이름을 붙임
            switch (menu) {
                case "1": {
                               ...

                    String detailMenu = sc.nextLine();

                    while (true) {  //다시 선택 루프
                        switch (detailMenu) {
                            case "1": {
                               ...

                                break againChoice1;
                            }
                            case "2": {
                               ...

                                break againChoice1;
                            }
                            case "3": {
                               ...

                                break againChoice1;
                            }
                            case "4": {
                               ...
                                break againChoice1;
                            }
                            case "5": {
                               ...
                                break againChoice1;
                            }
                            //엉뚱한걸 입력했을 때 다시 선택하게끔
                            default:
                                System.out.println("해당하는 번호를 입력해주세요");
                                detailMenu = sc.nextLine();
                        }
                    }
                }

추가 기능 구현해보기

  • '총 판매금액 조회', '총 판매상품 목록 조회' 기능 추가

  • 예외 상황에 대한 처리
    주문내역 없으면 다시 돌아가고, 해당하지 않는 다른 번호를 누르면 다시 누를 수 있도록 변경하였다. (안된는 곳도 있음 -> 하드코딩을 해서 코드를 짜는게 정답이 아닌듯해서 멈춤.)

  • 코드의 장단점

    • 단점: 다 프린트로 찍어내서 유지보수 힘듬. 중복코드
    • 장점: 복잡한 메서드가 없는 만큼 버그가 적다..?
        while (true) {
            System.out.println("\"밥집에 오신걸 환영합니다.\"\n" +
                    "아래 메뉴판을 보시고 메뉴를 골라 입력해주세요.\n" +
                    "\n" +
                    "[ 밥집 ]\n" +
                    "1. 한식  | 한국의 음식\n" +
                    "2. 중식  | 중국의 음식\n" +
                    "3. 일식  | 일본의 음식\n" +
                    "\n" +
                    "[ ORDER MENU ]\n" +
                    "4. Order       | 장바구니를 확인 후 주문합니다.\n" +
                    "5. Cancel      | 진행중인 주문을 취소합니다.\n"
            );

            System.out.print("원하는 것의 숫자만 입력하세요: ");
            String menu = sc.nextLine();

            againChoice1:     //다시 선택 하는 루프 깨기 위해 이름을 붙임
            switch (menu) {
                case "1": {

                    System.out.println("\"밥집에 오신걸 환영합니다.\"\n" +
                            "아래 상품메뉴판을 보시고 상품을 골라 입력해주세요.\n" +
                            "\n" +
                            "[ 한식 메뉴]\n" +
                            "1. " + korea1.name + " | " + korea1.price + " | " + korea1.explanation + "\n" +
                            "2. " + korea2.name + "    | " + korea2.price + " | " + korea1.explanation + "\n" +
                            "3. " + korea3.name + " | " + korea3.price + " | " + korea1.explanation + "\n" +
                            "4. " + korea4.name + "  | " + korea4.price + " | " + korea1.explanation + "\n" +
                            "5. " + korea5.name + "     | " + korea5.price + " | " + korea1.explanation + "\n");

                    String detailMenu = sc.nextLine();

                    while (true) {                            //다시 선택 루프
                        switch (detailMenu) {
                            case "1": {
                                //메서드로 코드를 줄여봤다.
                                print.hey(sc,order,korea1,korea1.name,korea1.price,korea1.explanation);

                                break againChoice1;
                            }
			
       	     							...
                                        
            
                            //엉뚱한걸 입력했을 때 다시 선택하게끔
                            default:
                                System.out.println("해당하는 번호를 입력해주세요");
                                detailMenu = sc.nextLine();
                        }
                    }
                }
                
                
                						...
                                        ...
                                        ...


                case "0":

                    double totalMoney = 0;
                    for (Product total : totalMenu.menuSum) {
                        totalMoney += total.price;
                    }

                    System.out.println("\n[ 총 판매상품 목록 현황 ]");
                    //상품 판매가 아직 안됐다면 로직 추가
                    if (totalMoney==0) {
                        System.out.println("아직 판매된 물품이 없습니다.");
                    } else {
                        System.out.println("현재까지 총 판매된 상품 목록은 아래와 같습니다.");

                        //다시 한번, 중복 제거 코드!!!
                        Map<Product,Integer> productCount2 = new HashMap<>();

                        for (Product check2 : totalMenu.menuSum) {
                            if (productCount2.containsKey(check2)) {
                                int count = productCount2.get(check2);
                                productCount2.put(check2, count+1);
                            } else {
                                productCount2.put(check2, 1);
                            }
                        }

                        for (Map.Entry<Product,Integer> check2 : productCount2.entrySet()) {
                            System.out.println("-" + check2.getKey().name+"   | "+check2.getValue()+"개 | W " + check2.getKey().price);

                        }

                    }
                    System.out.println("\n[ 총 판매금액 현황 ]");
                    System.out.println("현재까지 총 판매된 금액은 [ W "+totalMoney+" ] 입니다.\n");
                    System.out.println("1. 돌아가기");

                    String back = sc.nextLine();
                    System.out.println("사실 뭘 눌러도 돌아감.\n");
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }


                    break;

                default:
                    System.out.println("1~5의 숫자로만 입력해주세요.\n");

            }
        }

관련 포스팅

Following Post

profile
I live in Seoul, Korea, Handsome

0개의 댓글