2013년 10월 30일 과제

 

다음 인터페이스를 사용하는 자판기프로그램을 자유롭게 만드세요.

interface Vending {
	/*
	 *  자판기 인터페이스
	 *    1. 금액을 넣는 메소드
	 *    2. 물건을 선택하는 메소드
	 *    3. 거스름돈을 남겨주는 메소드
	 */
	    abstract int inputMoney(int money);
	    abstract int selectProduct(int select);
	    abstract void changeMoney(int money);
	     // 매개변수의 이름은 바꿔도 상관없다.
      
	}

 

세개의 파일로 구성

interface Vending - 문제로 내준 인터페이스

 

class VendingP - 자판기프로그램에서 사용하는 여러가지 기능들이 담겨있는 클래스

  - ProductInfo 클래스 생성하여 상품정보 입력(콜라/1000, 사이다/800, 커피/600)

  - statc 변수로 total_money 선언, 현재 금액이 유지되게 함

  - 금액을 입력받는 메소드 ( inputMoney() )

  - 선택값을 받아와서 메뉴를 선택하는 메소드 ( selectProduct() )

  - 거스름돈을 계산하는 메소드 ( chageMoney() )

  - 현재 금액에 따라 메뉴를 다르게 출력하는 메소드 ( menuPrint() )

  - 추가 금액을 입력받는 메소드 ( addmoney() )

  - 자판기를 이용하는 과정을 담은 메소드 ( buy() )

    - 메뉴를 출력

    - 음료선택받음

    - 메뉴선택 메소드 실행

    - 금액이 부족하거나, 0을 선택시 반복문을 빠져나감

    - 0선택시 true반환, 금액이 부족할시 false반환하여 나중에 추가구매여부 질문을 결정

  - 추가구매여부 질문 메소드 ( askaddbuy() )

    - 1은 true를 반환하여 추가구매 / 0(혹은 나머지)은 false반환하여 종료 

 

class VendingEx - 메인메소드가 있는 실제 실행하는 자판기 프로그램

  - VendingP클래스 생성

  - 메소드를 이용하여 돈을 입력 받음

  - 메소드를 이용하여 메뉴를 선택

  - 메소드를 이용하여 추가 구매여부 확인

  - 메소드를 이용하여 거스름돈 계산 및 출력

 

class ProductInfo - 상품정보를 생성하는 클래스

  - 상품명, 상품가격

 

Vending.java

interface Vending {
	/*
	 *  자판기 인터페이스
	 *    1. 금액을 넣는 메소드
	 *    2. 물건을 선택하는 메소드
	 *    3. 거스름돈을 남겨주는 메소드
	 * 
	 */
	//static byte PowerOn=1; //자판기 전원 ON상태
	//static byte PowerOff=0; //자판기 전원 OFF상태
	
	    abstract int inputMoney(int money);
	    abstract int selectProduct(int select);
	    abstract void changeMoney(int money);
	     // 매개변수의 이름은 바꿔도 상관없다.
      
	}

 

ProductInfo.java

/*
 * 상품정보 Class
 * 
 * 데이터 : 상품명, 상품값
 * 
 */
class ProductInfo {
	String p_name;
	int p_price;
	
	ProductInfo(String p_name,int p_price){
		this.p_name=p_name;
		this.p_price=p_price;
	}
}

 

VendingP.java

import java.util.*;

class VendingP implements Vending {
	/*
	 * 상품명과 가격은 상품정보 클래스로 가져다 쓰는 형태로 만들어보자. 나중에 상품을 변경할 수 있게 상품명과 가격을 같이 수정할 수
	 * 있도록 조건문을 만들자.
	 */
	ProductInfo p[] = { new ProductInfo("콜라", 1000),
			new ProductInfo("사이다", 800), new ProductInfo("커피", 600) };

	static int total_money = 0; // 총 금액

	private Scanner sc2;

	private Scanner sc3;

	private Scanner sc4;

	@Override
	/*
	 * inputMoney메소드 - 돈을 입력받고 total_money에 더해준다 - total_money값을 반환한다
	 */
	public int inputMoney(int money) {
		total_money += money;
		return total_money;
	}

	@Override
	// 선택값을 받아와서 메뉴를 선택하는 메소드
	public int selectProduct(int select) {
		switch (select) {
		case 1:
			if (total_money - p[0].p_price >= 0) {
				System.out.println(p[0].p_name + "\n");
				total_money = total_money - p[0].p_price;
				System.out.println("현재금액 : " + total_money + "\n");
			} else {
				System.out.println("금액이 모자랍니다.");
				// changeMoney(total_money);
			}

			break;
		case 2:
			if (total_money - p[1].p_price >= 0) {
				System.out.println(p[1].p_name + "\n");
				total_money = total_money - p[1].p_price;
				System.out.println("현재금액 : " + total_money + "\n");
			} else {
				System.out.println("금액이 모자랍니다.");
				// changeMoney(total_money);
			}

			break;
		case 3:
			if (total_money - p[2].p_price >= 0) {
				System.out.println(p[2].p_name + "\n");
				total_money = total_money - p[2].p_price;
				System.out.println("현재금액 : " + total_money + "\n");
			} else {
				System.out.println("금액이 모자랍니다." + "\n");
				// changeMoney(total_money);
			}

			break;
		case 0:
			System.out.println("이용해주셔서 감사합니다." + "\n");
			// changeMoney(total_money);
			break;

		default:
			System.out.println("잘못선택했습니다." + "\n");
			// changeMoney(total_money);
			break;
		}

		return total_money; // 남은 금액 반환
	}

	@Override
	/*
	 * 거스름돈을 내주는 메소드
	 * - 1000원 / 500원 / 100원 형태로 돌려준다. 
	 */
	public void changeMoney(int money) {
		int unit = 1000, num, sw = 1;
		System.out.print("거스름돈 : ");
		while (unit >= 100) {
			num = money / unit;
			money = money - unit * num;
			// System.out.println("*"+money);
			if (num != 0) {
				System.out.print(unit + "원" + "(" + num + ")");
			}

			if (sw == 1) {
				unit = unit / 2;
				sw = sw * (-1);
			} else {
				unit = unit / 5;
				sw = sw * (-1);
			}
		}
		System.out.println();

	}

	/*
	 * 현재 금액에 따라서 메뉴를 다르게 출력하는 메소드 - 뽑을 수 있는 음료에 *이라는 문자를 붙여서 출력
	 */
	public void menuPrint(int money) {
		System.out.println("★★★★★★★★★★★★★★★★★★★★★");
		for (int i = 0; i < p.length; i++) {
			if (p[i].p_price <= money) {
				System.out.print("*");
			} else {
				System.out.print(" ");
			}
			System.out.print(p[i].p_name + "[" + p[i].p_price + "] ");

		}
		System.out.println("\n★★★★★★★★★★★★★★★★★★★★★");
		System.out.println("\n");
	}

	public void addmoney() {
		while (total_money < 600) {
			System.out.println("추가로 돈을 넣어주세요.");
			sc2 = new Scanner(System.in);
			int addmoney = sc2.nextInt();
			inputMoney(addmoney);
			System.out.println("현재금액 : " + total_money + "\n");
		}
	}

	/*
	 * 음료를 선택해서 구입하는 과정 메소드 - boolean 타입으로 리턴하여 반복문을 빠져나가는 값으로 사용한다. - 0을 선택하면
	 * true값을 리턴하여 바로 종료 - 금액이 부족하면, 음료를 더 구입할건지 물어보기 위해서 false 리턴
	 */
	public boolean buy() {
		int select;
		while (true) {
			menuPrint(total_money);
			System.out
					.println("음료를 선택해주세요.\n(종료는 0, *표시가 된 음료가 현재 뽑을 수 있는 음료입니다.)\n");
			sc3 = new Scanner(System.in);
			select = sc3.nextInt();
			selectProduct(select);
			if (select == 0)
				break;
			if (VendingP.total_money < 600)
				break;

		}
		if (select == 0) {
			return true;
		} else {
			return false;
		}

	}

	/*
	 * 추가음료를 구매할건지 물어보는 메소드 1을 입력받으면 추가로 음료를 구매(true)하고, 0을 입력받으면 종료(false)
	 */
	public boolean askaddbuy() {
		System.out.println("추가 음료를 구입하시겠습니까?(구입:1 / 종료:0)");
		sc4 = new Scanner(System.in);
		int select = sc4.nextInt();
		if (select == 1)
			return true;
		else
			return false;
	}

}

 

VendingEx.java

import java.util.*;

class VendingEx {
	private static Scanner sc;
	boolean ask=false;
	

	public static void main(String[] args) {
		VendingP v = new VendingP();
		boolean ask = false; //추가 구입여부를 저장하는 int 변수
		
		v.menuPrint(VendingP.total_money);
		System.out.println("돈을 넣어주세요");
		sc = new Scanner(System.in);
		int money = sc.nextInt();
		v.inputMoney(money);
		System.out.println("현재금액 : " + VendingP.total_money + "\n");
		
		do{
		v.addmoney(); //추가금액을 입력하는 메소드 호출
		boolean end=v.buy(); 
			//  상품을 고르지 않고 종료할 경우 (0을 선택할 경우 true를 리턴)
		 if(end==true) // end값이 true면 반복문을 빠져나간다.
			 break;
		 ask = v.askaddbuy(); 
		 /*
		  * 추가로 구매할 것인지 물어보는 메소드, 추가구매는 true 종료는 false값을 리턴
		  * false값을 리턴하면 do while문을 빠져나간다.
		  */
	
		}while(ask);
			
		v.changeMoney(VendingP.total_money); // 종료되었으므로 거스름돈을 내준다.
		VendingP.total_money=0; // 값 초기화


	}
}