JAVA

[JAVA] 마지막 튜터링 (2021- 08-11 , 2021-08-13)

HJ39 2021. 8. 19. 17:48

마지막 튜터링 2일은 온라인 슈퍼마켓을 만들었다.

 

Mysql에 저장되어 있는 슈퍼마켓의 제품 이름, 유통기한, 제품 종류 , 제품 개수 , 할인율의 데이터를 가져와서 손님과 직원의 입장에서 사용할 수 있게끔 구성했다.

 

그리고 직원이 사용하는 메뉴에 들어가기 위해서는 아이디와 비밀번호가 필요한데 아이디와 비밀번호를 파일에 저장하여 입력한 값과 같으면 사용할 수 있도록 했다.

 

짧은 시간에 만들기도 했고 거대한(?) 프로젝트는 처음 구현해 봐서 여러 개의 파일로는 나누지 못했다..

그래서 한 파일에 구현했고 static을 사용해서 한 개의 클래스 내부에서 작성되었다.

 

프로그램이 종료되는 시점은 고객이 물건 계산을 완료하면 종료되게끔 구현했다.

 

참고) My sql을 처음 사용해서 데이터를 가져오는 것을 멘토분의 도움으로 구성해보았지만 sql table에 추가하거나 삭           제하는 방법을 몰라서 구현하지 못했다.

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.StringTokenizer;
import java.util.Vector;

public class Project1 {
	static StringBuffer sb = new StringBuffer();
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

	static Vector<Information> info = new Vector<Information>(); // 제품정보저장
	static Vector<Bucket> buck = new Vector<Bucket>();

	static class Information { // 제품 정보
		private String product; // 제품이름
		private int price; // 제품가격
		private String date; // 유통기한
		private String product_option; // 제품종류
		private int discount; // 할인률
		private int product_Num; // 제품 개수

		Information(String product, int price, String date, String product_option, int discount, int product_Num) {
			this.product = product;
			this.price = price;
			this.date = date;
			this.product_option = product_option;
			this.discount = discount;
			this.product_Num = product_Num;
		}

		public void input_Product_Num(int num) {
			this.product_Num += num;
		}

		public String return_product() {
			return product;
		}

		public int return_price() {
			return price;
		}

		public String return_date() {
			return date;
		}

		public String return_product_option() {
			return product_option;
		}

		public int return_discount() {
			return discount;
		}

		public int return_product_Num() {
			return product_Num;
		}

		public void print_information() {
			System.out.print(product + "\t");
			System.out.print(price + "\t");
			System.out.print(date + "\t");
			System.out.print(product_option + "\t");
			System.out.print(discount+"%" + "\t");
			System.out.println(product_Num);
		}

	}

	static class Worker { // 알바생 전용
		private static int Income; // 총매출

		public void Over_date() { // 유통기한 지난 목록 출력후 삭제
			// 유통기한들이 지났는지 반복문을 통해 Information 배열을 확인해야한다.
			Calendar now_date = Calendar.getInstance(); // 시스템상 시간 가져옴

			int year = now_date.get(Calendar.YEAR); // 시스템상 연도
			int month = now_date.get(Calendar.MONTH) + 1; // 시스템상 월
			int day = now_date.get(Calendar.DAY_OF_MONTH); // 시스템상 일

			for (int i = 0; i < info.size(); i++) {
				StringTokenizer st = new StringTokenizer(info.get(i).return_date(), "-");

				int product_Year = Integer.parseInt(st.nextToken());
				int product_Month = Integer.parseInt(st.nextToken());
				int product_Day = Integer.parseInt(st.nextToken());

				if (year > product_Year) {
					info.remove(i);
					i--;
				} else if (year == product_Year) {
					if (month > product_Month) {
						info.remove(i);
						i--;
					} else if (month == product_Month) {
						if (day > product_Day) {
							info.remove(i);
							i--;
						}
					}
				}
			}

			for (int i = 0; i < info.size(); i++) {
				info.get(i).print_information();
			}

		}

		public void left_product() { // 제고가 남아 있는지 확인 (10개 미만인경우 제품 추가)
			for (int i = 0; i < info.size(); i++) {
				if (info.get(i).return_product_Num() < 10) {
					info.get(i).input_Product_Num(100); // 제고 100개 추가
				}
			}
			for (int i = 0; i < info.size(); i++) {
				info.get(i).print_information();
			}

		}

		public static void input_Total_Money(int money) {
			Income += money;
		}

		public static void print_Total_Money() throws IOException {
			bw.write(Income);
			bw.flush();

		} // 매출

	}

	static class Bucket { // 장바구니
		String product;
		int price;
		int product_count;
		int discount;

		Bucket(String product, int price, int product_count, int discount) {
			this.product = product;
			this.price = price;
			this.product_count = product_count;
			this.discount = discount;
		}

		public void print_Bucket() throws IOException {
			bw.write(this.product + "\t" + this.price + "\t" + this.product_count + "\t" + this.discount+"%" + "\n");
			bw.flush();
		}

		public String return_Product() {
			return this.product;
		}

	}

	static class Customer { // 손님

		public void print_product_option() throws IOException { // 제품종류 입력시 제품종류 출력
			bw.write("원하는 제품종류를 입력하세요 >>");
			bw.flush();
			String need = br.readLine(); // 제품 종류
			boolean flag = false;

			// 제품 종류와 비교하여 존재하면 출력 없는 경우 제품 다 떨어졌다고 출력
			for (int i = 0; i < info.size(); i++) {
				if (need.equals(info.get(i).return_product_option())) {
					info.get(i).print_information();
					flag = true;
				}
			}
			if (flag == false) {
				bw.write("다 떨어졌습니다.\n");
				bw.flush();
			}

			// 재품이 존재하는 경우 실행
			do {
				bw.write("제품을 장바구니에 담으시겠습니까? >> (y,n)");
				bw.flush();
				char choose = br.readLine().charAt(0);
				if ((choose == 'y') || (choose == 'Y')) {

					bw.write("원하는 제품의 이름과 개수를 입력하세요.\n");
					bw.write("제품 이름 >>");
					bw.flush();
					String need_product = br.readLine();// 출력된 제품 종류중에 필요한 제품 선택
					bw.write("제품 개수 >>");
					bw.flush();
					int product_count = Integer.parseInt(br.readLine()); // 선택된 제품중 필요한 제품 개수 입력
					// 장바구니에 담기
					for (int i = 0; i < info.size(); i++) {
						if (need.equals(info.get(i).return_product())) {
							if (product_count < info.get(i).return_product_Num()) {
								bw.write("제품이 없습니다. ㅎㅎㅎㅎ\n");
								bw.flush();
								return;
							}
						}
					}

					int price = 0;
					int discount =0;
					for (int i = 0; i < info.size(); i++)
						if (need_product.equals(info.get(i).return_product())) {
							price = info.get(i).return_price();
							discount = info.get(i).return_discount();
						}
					buck.add(new Bucket(need_product, price, product_count,discount));

				} else if ((choose == 'n') || (choose == 'N')) {
					return;
				} else {
					bw.write("잘못 입력하셨습니다\n");
					bw.write("다시 입력하세요.\n");
					bw.flush();
				}
			} while (true);

		}

		public void print_product() throws IOException { // 제품이름 검색시 해당제춤정보 출력
			bw.write("어떤 제품의 정보를 원하십니까? >>");
			bw.flush();
			String need = br.readLine(); // 제품 이름
			boolean flag = false;
			// 제품 이름과 비교하여 있으면 출력
			for (int i = 0; i < info.size(); i++) {
				if (need.equals(info.get(i).return_product())) {
					info.get(i).print_information();
					flag = true;
				}
			}
			if (flag == false) {
				bw.write("다 떨어졌습니다.\n");
				bw.flush();
			}

			// (제품이름 , 가격 , 개수) 장바구니에 담기

			while (true) {
				bw.write("제품을 장바구니에 담으시겠습니까? >> (y,n)");
				bw.flush();
				char choose = br.readLine().charAt(0);
				if ((choose == 'y') || (choose == 'Y')) {
					bw.write("몇개 구입하시겠습니까? >>");
					bw.flush();
					int product_Count = Integer.parseInt(br.readLine());
					int over_count = 0;

					for (int i = 0; i < info.size(); i++) {
						if (need.equals(info.get(i).return_product())) {
							over_count = i;

						}
					}

					if (product_Count > info.get(over_count).return_product_Num()) {
						bw.write("제품이 없습니다. ㅎㅎㅎㅎ\n");
						bw.flush();
						break;
					} else {

						// 장바구니에 담기
						int price = 0;
						int discount=0;
						for (int i = 0; i < info.size(); i++)
							if (need.equals(info.get(i).return_product())) {
								price = info.get(i).return_price();
								discount = info.get(i).return_discount();
							}
								
						buck.add(new Bucket(need, price, product_Count,discount));
						break;
					}
				} else if ((choose == 'n') || (choose == 'N')) {
					return;
				} else {
					bw.write("잘못 입력하셨습니다\n");
					bw.write("다시 입력하세요.\n");
					bw.flush();
				}

			}

		}

		public void print_discount() throws IOException { // 할인률 큰순서 출력
			Collections.sort(info, new Comparator() {
				public int compare(Object o1, Object o2) {
					Information info1 = (Information) o1;
					Information info2 = (Information) o2;

					return info2.discount - info1.discount;
				}
			});

			for (int i = 0; i < info.size(); i++) {
				info.get(i).print_information();
				;
			}

		}

		public void show_bucket() throws IOException { // 장바구니 목록
			for (int i = 0; i < buck.size(); i++) {
				buck.get(i).print_Bucket();
			}

			while (true) {
				bw.write("1.장바구니 수정 2.계산하기 3.장바구니 나가기>> ");
				bw.flush();
				int select = Integer.parseInt(br.readLine());

				switch (select) {
				case 1:
					insert_Bucket();
					break;
				case 2:
					Calculate();
					System.exit(0);
				case 3:
					return;
				default:
					bw.write("잘못입력하셨습니다.\n");
					bw.flush();
				}

			}

		}

		public void insert_Bucket() throws IOException {

			while (true) {

				bw.write("1. 개수 추가 2. 개수 취소 3. 삭제 4. 나가기");
				bw.flush();
				int choose = Integer.parseInt(br.readLine());

				if (choose == 4)
					break;

				bw.write("어떤 제품을 고르시겠습니까? >>");
				bw.flush();
				String product = br.readLine();

				int count = 0;

				switch (choose) {
				case 1:
					bw.write("몇개를 추가하시겠습니까? >>");
					bw.flush();
					count = Integer.parseInt(br.readLine());
					for (int i = 0; i < buck.size(); i++) {
						if (product.equals(buck.get(i).product)) {
							buck.get(i).product_count += count;
						}
					}
					break;
				case 2:
					bw.write("몇개를 취소하시겠습니까? >>");
					bw.flush();
					count = Integer.parseInt(br.readLine());
					for (int i = 0; i < buck.size(); i++) {
						if (product.equals(buck.get(i).product)) {
							buck.get(i).product_count -= count;
						}
					}
					break;
				case 3:
					for (int i = 0; i < buck.size(); i++) {
						if (product.equals(buck.get(i).product)) {
							buck.get(i).product_count = 0;
						}
					}
					break;
				default:
					bw.write("잘못입력하셨습니다.\n");
					bw.flush();
				}

			}

		}

		public void Calculate() throws IOException {
			do {
				bw.write("계산하시겠습니까?(y,n) >> ");
				bw.flush();
				char choose = br.readLine().charAt(0);
				if ((choose == 'y') || (choose == 'Y')) {
					// 결제 시스템
					int product_Total_Money = 0;
					for (int i = 0; i < buck.size(); i++) { // 장바구니에 있는 모든 제품의 가격 합하기
						product_Total_Money += (buck.get(i).price *
								buck.get(i).product_count*
								(1-((double)buck.get(i).discount/100)));
					}

					Worker.input_Total_Money(product_Total_Money);

					while (true) {
						bw.write("1.현금 2.카드 3.뒤로가기");
						bw.flush();

						int select = Integer.parseInt(br.readLine());

						if (select == 3)
							break;

						switch (select) {
						case 1:
							Money_Cal(product_Total_Money);
							return;
						case 2:
							Card_Cal(product_Total_Money);
							return;
						default:
							bw.write("잘못 입력하셨습니다\n");
							bw.write("다시 입력하세요.\n");
							bw.flush();
						}

					}

				} else if ((choose == 'n') || (choose == 'N')) {
					return;
				} else {
					bw.write("잘못 입력하셨습니다\n");
					bw.write("다시 입력하세요.\n");
					bw.flush();
				}
			} while (true);
		}

		public void Money_Cal(int product_Total_Money) throws IOException {

			while (true) {
				bw.write("얼마를 지불하시겠습니까? >>");
				bw.flush();
				int customer_Price = Integer.parseInt(br.readLine());
				if (customer_Price < product_Total_Money) {
					bw.write("금액이 부족합니다.\n");
					bw.flush();
				} else {
					int pay = customer_Price - product_Total_Money;
					int money_50000 = 0;
					int money_10000 = 0;
					int money_5000 = 0;
					int money_1000 = 0;
					int money_500 = 0;
					int money_100 = 0;
					int money_50 = 0;
					int money_10 = 0;

					bw.write(pay + "\n");
					bw.flush();

					money_50000 = pay / 50000;
					money_10000 = pay % 50000 / 10000;
					money_5000 = pay % 50000 % 10000 / 5000;
					money_1000 = pay % 50000 % 10000 % 5000 / 1000;
					money_500 = pay % 50000 % 10000 % 5000 % 1000 / 500;
					money_100 = pay % 50000 % 10000 % 5000 % 1000 % 500 / 100;
					money_50 = pay % 50000 % 10000 % 5000 % 1000 % 500 % 100 / 50;
					money_10 = pay % 50000 % 10000 % 5000 % 1000 % 500 % 100 % 50;

					bw.write("5만원권 : " + money_50000 + ", 1만원권 : " + money_10000 + ", 5천원권 : " + money_5000 + "\n");
					bw.write("1천원권 : " + money_1000 + ", 500원 : " + money_500 + ", 100원 : " + money_100 + "\n");
					bw.write("50원 : " + money_50 + ", 10원 : " + money_10 + "\n");
					bw.flush();
					break;
				}
			}
		}

		public void Card_Cal(int product_Total_Money) throws IOException {
			bw.write(product_Total_Money + "원을 결제하였습니다 :)\n");
			bw.flush();

		}

	}

	static boolean Check_Worker() throws IOException { // 알바생인지 확인하는 메소드
		// 알바생 저장된 정보 불러오기
		File work = new File("C:\\Users\\H_J\\Desktop\\대학\\2-2\\자바 튜터링\\src\\Project_Store\\Worker_code.txt");
		String id = null; // //파일에 저장된 알바생 이름
		String password = null; // 파일에 저장된 알바생 비밀번호

		try {

			FileReader fr = new FileReader(work); // 파일 읽기
			int c;
			while ((c = fr.read()) != -1)
				sb.append((char) c); // 파일 읽어서 stringbuffer에 한글자씩 저장

			StringTokenizer st = new StringTokenizer(sb.toString());
			// stringbuffer에 저장된 글자를 줄 개행 지준으로 구분

			id = st.nextToken(); // 알바생 이름
			password = st.nextToken(); // 알바생 비밀번호
			sb.setLength(0); // stringbuffer의 크기를 줄여 강제적으로 초기화
			fr.close(); // 알바생 정보 저장된 파일 닫기
		} catch (IOException e) {
			System.out.println(
					"C:\\Users\\H_J\\Desktop\\대학\\2-2\\자바 튜터링\\src\\Project_Store\\Worker_code.txt를 읽을수 없습니다.");
		}

		bw.write("id >>");
		bw.flush();
		String input_id = br.readLine(); // 입력할 알바생이름
		bw.write("password >>");
		bw.flush();
		String input_password = br.readLine(); // 입력할 알바생 비밀번호
		bw.flush();

		if (id.equals(input_id) && password.equals(input_password)) { // 입력한 알바생 정보가 알바생인 경우
			return true;
		} else { // 알바생과 정보가 일치하지 않는 경우
			bw.write("입력한 정보가 정확하기 않습니다.\n");
			bw.flush();
			return false;
		}
	}

	static void Worker_Memu() throws IOException { // 알바생 정보를 입력하는 메소드

		if (Check_Worker()) {
			// 알바생 전용 class 실행
			while (true) {

				bw.write("알바생 전용 메뉴입니다\n");
				bw.write("1.유통기한 2.제품수량 3.매출량 4.알바생메뉴종료 >>");
				bw.flush();

				int Options = Integer.parseInt(br.readLine()); // 알바생 전용 메뉴 선택
				Worker wk = new Worker(); // 클래스 선언

				if (Options == 4)
					break;

				switch (Options) {
				case 1:
					wk.Over_date();
					break;
				// 유통기한 지났는지

				case 2:
					wk.left_product();
					// 제품 개수
					break;
				case 3:
					wk.print_Total_Money();
					break;
				default:
					bw.write("입력오류\n");
					bw.flush();
					break;
				}
			}
		} else {
			return;
		}
	}

	static void Customer_Memu() throws IOException {

		while (true) {

			bw.write("손님전용 메뉴입니다\n");
			bw.write("원하는 메뉴를 선택해주세요\n");
			bw.write("1.제품종류 2.제품이름 3.오늘의 할인 4.장바구니 >> ");
			bw.flush();
			int choose = Integer.parseInt(br.readLine());
			Customer ct = new Customer();
			switch (choose) {
			case 1:
				ct.print_product_option();
				break;
			case 2:
				ct.print_product();
				break;
			case 3:
				ct.print_discount();
				break;
			case 4:
				ct.show_bucket();
				break;
			default:
				bw.write("잘못입력하셨습니다\n");
				bw.write("다시 입력하세요\n");
				bw.flush();
				break;
			}

		}

	}

	public static void printData(ResultSet srs, String[] cols) throws SQLException {
		while (srs.next()) {
			String product = ""; // 제품이름
			int price = 0; // 제품가격
			String date = ""; // 유통기한
			String product_option = ""; // 제품종류
			int discount = 0; // 할인률
			int product_Num = 0; // 제품 개수

			for (int i = 0; i < cols.length; i++) {
				if (cols[i].equals("제품")) {
					product = srs.getString(cols[i]);

				}
				if (cols[i].equals("가격")) {
					price = Integer.parseInt(srs.getString(cols[i]));
				}
				if (cols[i].equals("유통기한")) {
					date = srs.getString(cols[i]);
				}
				if (cols[i].equals("제품종류")) {
					product_option = srs.getString(cols[i]);
				}
				if (cols[i].equals("할인(%)")) {
					discount = srs.getInt(cols[i]);
				}
				if (cols[i].equals("제품 개수")) {
					product_Num = srs.getInt(cols[i]);
				}
			}
			info.add(new Information(product, price, date, product_option, discount, product_Num));
		}
	}

	public static void main(String[] args) throws IOException {

		try {
			Connection conn = DriverManager.getConnection(
					"jdbc:mysql://db-java-study.cm3rcbp5wyir.ap-northeast-2.rds.amazonaws.com:3306/simulationDBs",
					"wjdghwls", "1234");

			Statement stmt = conn.createStatement();

			ResultSet srs = stmt.executeQuery("Select * from HoJin_table");
			String cols[] = { "id", "제품", "가격", "유통기한", "제품종류", "할인(%)", "제품 개수" };
			printData(srs, cols);

		} catch (SQLException e) {
			e.printStackTrace();
		}

		// 출력
		while (true) { // 24시간 운영
			bw.write("1. 알바생 2.손님 >>");
			bw.flush();
			int choose = Integer.parseInt(br.readLine());

			switch (choose) { // 알바생,손님의 따라 다르게 작동
			case 1: // 알바생
				Worker_Memu();
				break;
			case 2: // 손님
				Customer_Memu();
				break;
			default:
				bw.write("잘못 입력했습니다.\n");
				bw.flush();
			}
		}

	}
}

 

맨 위로