프로그래밍언어/자바

[자바도전기] 자판기(2)

놀고싶다~ 2021. 2. 26. 10:50

안녕하세요!

 

오늘은 자판기 만들기 두번째 시간을 가져보려고 합니다!

 

지난 시간에는 우리가 실제로 Main화면에 나타나는 로직만 구성을 하였습니다.

 

오늘은 사용자가 돈을 넣었을때의 금액이 자판기로 들어오는 클래스 1가지와

 

제품을 구매하는 곳으로 넘어가 가격 설정 및 수량을 설정하는 클래스 총 2가지를 작성해보겠습니다.

 

먼저 돈을 넣는 클래스인 Cash 클래스를 작성해보겠습니다.

 

package coffee;

public class Cash {
	private int money;
	private int price;
	
	public void setMoney(int money) {
		this.money = money;
	}
	public int getMoney() {
		return this.money;
	}
	
	public int getPrice() {
		return price;
	}
	
	
}

Cash 클래스의 로직은 간단합니다.

 

getter setter 를 통해서 사용자의 돈을 받은 다음 이 금액을 자판기에 넘겨 주어서 사용자가 투입한 금액이 자판기에 보일 수 있도록 넘겨 주는 것입니다.

 

여기서 주의할 점이 한 가지 있습니다.

 

만약 사용자의 금액이 1000원인데 투입된 금액이 500원으로 표시된다? 이럴 수가 있을까 하지만

우리가 지정한 money를 public으로 지정하였다면 금액이 변할 수 있습니다 따라서 우리가 투입한 금액이 다른 클래스에서는 수정이 되지 않도록 하기 위해서 private로 지정해두어야합니다.

 

이제 다음으로 자판기의 내부 클래스를 만들어 보도록 하겠습니다.

 

package coffee;

import java.util.Scanner;

public class Coffee {
	
		Cash cash = null;
		
		// 음료 가격
		public int coffee_price = 300;
		public int cocoa_price = 300;
		public int milk_price = 300;
		public int milk1_price = 300;
		 
		// 음료의 수량
		public int coffee = 10;
		public int cocoa = 10;
		public int milk = 10;
		public int milk2 = 10;
	
	// 자판기 프로그램 UI
	public void vending_machine(Cash cash) {
		
		System.out.printf("\n");
		System.out.println("========== 자판기 ==========");
		System.out.printf("투입 금액 : %d \n",cash.getMoney());
		System.out.println("1. 커피 (300)");
		System.out.println("2. 코코아 (300)");
		System.out.println("3. 우유 (300)");
		System.out.println("4. 율무차 (300)");
		System.out.println("5. 거스름돈 반환");
		
	}
	
	//자판기 음료 구매 및 비용 환불 
	public void menu (Cash cash) {
		
		Scanner src = new Scanner(System.in);
		
		// 메뉴 번호 인자
		int selection = 0;
		
		int money = cash.getMoney();
		
		while(selection != 5) {
			
			System.out.println("메뉴를 선택하세요.");
			selection = src.nextInt();
			
		switch(selection) {
		case 1:
			if(money >= coffee_price && coffee > 0) {
				System.out.println("커피 구매가 완료되었습니다");
				 money -= coffee_price;
				coffee -= 1;
			}
			else if(money >= coffee_price && coffee < 0) {
				System.out.printf("커피 재고가 부족하여 구매에 실패했습니다. 돈을 반환합니다");
				
				}
			
			else if(money < coffee_price){
				System.out.println("금액이 부족합니다.");
				break;
			}
			System.out.printf("\n");
			System.out.printf("현재 잔액은 %d원 입니다.\n",money);
			break;
		
			
		case 2:
			if(money >= 300) {
				System.out.println("코코아 구매가 완료되었습니다");
				money -= cocoa_price;
				cocoa -= 1;
			}
			else if(money >= cocoa_price && cocoa < 0) {
				System.out.printf("코코아 재고가 부족하여 구매에 실패했습니다. 돈을 반환합니다");
				
				}
			
			else if(money < cocoa_price){
				System.out.println("금액이 부족합니다.");
			}
			System.out.printf("\n");
			System.out.printf("현재 잔액은 %d원 입니다.\n",money);
			break;
			
		case 3:
			if(money >= milk_price) {
				System.out.println("우유 구매가 완료되었습니다");
				money -= milk_price;
				milk -= 1;
			}
			else if(money >= milk_price && milk < 0) {
				System.out.printf("우유 재고가 부족하여 구매에 실패했습니다. 돈을 반환합니다");
				
				}
			
			else if(money < milk_price){
				System.out.println("금액이 부족합니다.");
			}
			System.out.printf("\n");
			System.out.printf("현재 잔액은 %d원 입니다.\n",money);
			break;
			
		case 4:
			if(money >= milk1_price) {
				System.out.println("율무차 구매가 완료되었습니다");
				money -= milk1_price;
				milk2 -= 1;
			}
			else if(money >= milk1_price && milk2 < 0) {
				System.out.printf("율무차 재고가 부족하여 구매에 실패했습니다. 돈을 반환합니다");
				}
			else if(money < milk1_price){
				System.out.println("금액이 부족합니다.");
				break;
			}
			System.out.printf("현재 잔액은 %d원 입니다.\n",money);
			break;
			
		case 5:
			System.out.printf("현재 금액은 %d입니다. 거스름돈을 받으세요 \n",money);
			break;
			}
		
		if(money <= 100) {
			System.out.printf("\n");
			System.out.printf("잔액이 부족합니다. 거스름돈 %d원을 반환합니다\n",money);
			break;
		}
		
		}
	}
}

 

코드가 많이 길어졌습니다. 하지만 여기서 다른 클래스로 나눈다면 더 세부적으로 진행 할 수 있으니 차후에 진행 해보도록 하겠습니다.

 

위 로직은 각각의 상품을 구매 했을시에 나오는 로직이므로 반복되는 코드가 많기때문에 코드가 길어보일 뿐이지 사실 복잡한 코드는 아님을 말씀드립니다.

 

오늘은 코드를 구현하는 것까지 마무리 하였습니다.

 

다음 시간에 실제로 실행하고 앞으로 추가로 수정을 해야 하는 부분들에 대해서 말씀드리고 마무리 하도록 하겠습니다.

 

수고많으셨습니다!