JAVA

[Java-개발해보기.1] 카페 키오스크

식빵민 2022. 5. 23. 20:12

핵심 개발 내용

  • 커피클래스로 각 메뉴 클래스 객체로 생성
  • 각 메뉴별로 이름, 가격, 재고 관리
  • 재고에 따라 주문 가능/불가능 여부 판단
  • 재고관리를 하는 관리자 모드

 

키오스크 핵심 기능 

  • 키오스크 초기화
  • 키오스크 주문
  • 키오스크 재고관리
class coffee{ //coffee클래스 생성
	public coffee(String m,int p,int a) {
		menu=m;
		price=p;
		amount=a;
	} //생성자 
	String menu; //메뉴 이름 변수
	int price; //메뉴 가격 변수
	int amount; //메뉴 수량 변수
	public String getmenu() {return menu;} //menu를 return해주는 get함수
	public void setmenu(String m) {menu = m;} //menu를 초기화하는 set함수
	public int getprice() {return price;} //price를 return해주는 get함수
	public void setprice(int p) {price = p;} //price를 초기화하는 set함수
	public int getamount() {return amount;} //amount를 return해주는 get함수
	public void setamount(int a) {amount = a;} //amount를 초기화하는 set함수	
}

 

public class Kiosk { //메인함수가 속해있는 키오스크 클래스
	public static coffee[] MenuList; //coffee type의 배열 선언
	public static void first() { // 키오스크 초기화 함수
		System.out.println("[키오스크 초기화]");
		Scanner scanner = new Scanner(System.in);
		System.out.print("판매하고자 하는 메뉴 종류 수를 입력하시오->");
		int num = scanner.nextInt(); //메뉴 종류의 수 변수 선언
		MenuList = new coffee[num]; //coffee 형 배열 MenuList동적할당
		for(int i=0;i<num;i++) { //메뉴 종류의 수 만큼 반복
			MenuList[i] = new coffee("",0,0); 
			//배열의 i번째마다 새로운 coffee형 변수저장 
			System.out.print("판매하고자 하는 " + i +"번 메뉴 이름, 가격, 재고를 입력하시오->");
			String m = scanner.next();// 
			MenuList[i].setmenu(m);// i번째의 menu에 이름을 m으로 초기화
			int p = scanner.nextInt();
			MenuList[i].setprice(p);// i번째의 menu에 가격을 p로 초기화
			int a = scanner.nextInt();
			MenuList[i].setamount(a);// i번째의 menu에 수량을 a로 초기화
		}
		System.out.println("[초기화 완료]");
		System.out.println(" ");
		
	}


	public static void order(){// 키오스크의 핵심, 주문 함수
		Scanner scanner = new Scanner(System.in);
		String order;//주문을 받기위한 문자열 변수 order선언
		
		do{//최소 한번은 실행 해야 하므로 do while문 사용
			int sumPrice = 0;//매번 주문마다 총 금액 재선언
			System.out.println("[메뉴판]");
			for(int i=0;i<MenuList.length;i++)
			{	System.out.println(MenuList[i].getmenu()+":"+MenuList[i].getprice()+"원"+"(재고"+MenuList[i].getamount()+")");
			}//MenuList배열에 저장된 값을 기반으로 메뉴판 출력
			System.out.println("구매하고자 하는 메뉴를 입력하시오->");
			order = scanner.next();//order변수 입력받음
			if(order.equals("종료")) {
				break;
			}//종료가 입력되면 반복문을 멈추고 함수 종료
			while(!order.equals("주문")) {
				//’주문’이라는 문자열이 입력되기 전까지 반복하여 주문을 받음
				if(order.equals("재고관리")) {
					admin();
					break;
				}//재고관리를 입력받으면 관리자 함수 admin()호출후 while문 종료
				for(int i=0;i<MenuList.length;i++)
				// MenuList의 길이만큼 탐색
				{
					if(order.equals(MenuList[i].getmenu())) {
						//order와 getmenu를 통해 얻어온 MenuList i번째 자료의 메뉴명이 같은 경우
						if((MenuList[i].getamount()>0)) {
							//getamount함수로 얻어온 해당 자료의 amount가 0보다 크다면
									sumPrice+=MenuList[i].getprice();
									//합계금액에 getprice함수로 얻어온 해당자료의 price 더함
									MenuList[i].setamount(MenuList[i].getamount()-1);
									//setamount함수를 이용해 해당 자료의 amount에서 하나를 뺌.
						}
						else {
							// getamount함수로 얻어온 해당 자료의 amount가 0보다 작거나 같다면
							System.out.println("재고 소진, 다시 주문해주십시오.");
							for(int j=i-1;j>=0;j--) {
								MenuList[j].setamount(MenuList[j].getamount()+1);
								// 재고가 없는 메뉴를 주문할 경우 이전에 입력된 메뉴도 주문 취소
							}
							sumPrice = 0;//주문취소했기 때문에 합계금액은 0원
						}
					}
				}
				order = scanner.next();//다음 order 입력
			}
			if(sumPrice != 0) {//주문이 입력 되면 
				System.out.println("전체 금액은 " + sumPrice +"원입니다.");
			}//합계금액 출력
		}while(!(order.equals("종료")));//order에 종료가 입력되기 전까지.
		scanner.close();
	}
	
public static void admin(){//재고관리 함수
		System.out.println("[관리자 모드]");
		Scanner scanner = new Scanner(System.in);
		String cmd ;//명령어 변수 cmd선언
		
		do{//최소 한번은 실행하기 위해 do-while문 사용
			System.out.print("관리자 모드를 나가려면 '종료'를, 재고 변경을 원하면 메뉴 이름을 입력하세요.->");
			cmd = scanner.next();//종료 or 재고변경을 원하는 메뉴이름 cmd 입력받음
			if(cmd.equals("종료")) {
				break;
			}//종료입력시 반복문 종료
			for(int i=0;i<MenuList.length;i++)
			{// MenuList의 길이만큼 탐색
				if(cmd.equals(MenuList[i].getmenu())) {
					//cmd와 와 getmenu를 통해 얻어온 MenuList i번째 자료의 메뉴명이 같은 경우
					System.out.println(MenuList[i].getmenu()+"의 재고는 현재"+MenuList[i].getamount()+"입니다.");
					//해당 자료의 amount출력
					int new_amount = scanner.nextInt();
					//새로운 amount 입력
					MenuList[i].setamount(new_amount);
					//입력받은 새로운 amount setamount함수 사용해서 재설정
				}
			}
		}while(!cmd.equals("종료"));//cmd가 종료면 종료시킴
	}
	public static void main(String[] args) {
		System.out.println("12211580_컴퓨터공학과_김수환");
		first();
		order();
		System.out.println("종료되었습니다.");
		//모든함수가 종료되면 “종료되었습니다” 출력
	}
}​