[실습] 시작하기
🎮 직접 코드 구현하기
💾 개요에서 확인한 요청서와 참고 사항을 확인하고 알맞은 프로그램을 제작하여 봅시다.
📘 해당 과제는 실습과 제출이 필요 없는 과제입니다. 레퍼런스 코드의 경우 섹션이 모두 종료된 이후 공개됩니다.
ref v1
단순하게 배열만 활용
Feedback
package jungmin.ref.v1;
public class Feedback {
private String customerName;
private String shopName;
private String foodName;
private int grade;
/**
* @Feedback() : 정보를 저장합니다
*/
public Feedback(String customerName, String shopName, String foodName, int grade) {
this.customerName = customerName;
this.shopName = shopName;
this.foodName = foodName;
this.grade = grade;
}
public String getCustomerName() {
return customerName;
}
public String getShopName() {
return shopName;
}
public String getFoodName() {
return foodName;
}
/**
* @getStars() : 사용자가 입력한 점수가 별점(★★★★★)으로 전환'
*/
public String getGrade() {
String star = "";
for (int i = 0; i < this.grade; i++) {
star += "★";
}
return star;
}
/**
* @printInfo() : 출력
*/
public void printInfo() {
System.out.println(this.customerName + " [고객님]");
System.out.println("-".repeat(35));
System.out.println("주문 매장 : " + this.shopName);
System.out.println("주문 메뉴 : " + this.foodName);
System.out.println("별점 : " + getGrade());
}
}
Order
package jungmin.ref.v1;
public class Order {
private String customerName;
private String shopName;
private String foodName;
/**
*@Order():주문 정보를 저장합니다.
**/
public Order(String customerName, String shopName, String foodName) {
this.customerName = customerName;
this.shopName = shopName;
this.foodName = foodName;
}
public String getCustomerName() {
return customerName;
}
public String getShopName() {
return shopName;
}
public String getFoodName() {
return foodName;
}
}
Shop
package jungmin.ref.v1;
public class Shop {
/**
* 등록 가능한 음식 수, 음식 초기화 변수, 가격 필드 생성
* 매장명, 메뉴명, 가격 필드 생성
* */
private static final int FOOD_MAX = 5;
private static final String EMPTY_FOOD = "";
private static final int EMPTY_PRICE = 0;
private String shopName;
private String[] foodNames;
private int[] prices;
/**
* @Shop() : 생성자 정의
* 매장만 먼저 입력받도록 합니다.
* 나머지 변수는 initValues() 에서 정의합니다.
* */
public Shop(String shopName) {
this.shopName = shopName;
initValues();
}
/**
* @initValues() : 메뉴명와 가격정보를 담는 배열 생성 및 초기화
* EMPTY_FOOD = "", EMPTY_PRICE = 0
*/
//상수에 들어있는 값을 가지고 초기화 , 생성자와 약간 다른 역할
private void initValues() {
foodNames = new String[FOOD_MAX];
prices = new int[FOOD_MAX];
for (int i = 0; i < foodNames.length; i++) {
foodNames[i] = EMPTY_FOOD;
}
}
/**
* @addFood() : 위 코드에서 정의된 변수를 받아 출력과 객체에 저장합니다.
*/
public void addFood(String foodName, int price) {
int currentIdx = -1;
for (int i = 0; i < foodNames.length; i++) {
if (foodNames[i].equals("")) {
currentIdx = i;
break;
}
}
if (currentIdx != -1) {
foodNames[currentIdx] = foodName;
prices[currentIdx] = price;
} else {
// 예외일 경우
}
}
}
KDeliveryMain
package jungmin.ref.v1;
import jungmin.kdelivery.Feedback;
import jungmin.kdelivery.Order;
import jungmin.kdelivery.Shop;
import java.util.Scanner;
// 클래스를 정의 합니다.
public class KDeliveryMain {
/**
* 음식점 등록 개수, 음식 주문 가능 횟수, 리뷰 등록 가능 횟수 정의
* */
private static int SHOP_MAX = 5;
private static int ORDER_MAX= 5;
private static int FEEDBACK_MAX = ORDER_MAX;
/**
* 배열을 담을 수 있는 객체 생성
* 사용 범위, 객체 타입, 객체 이름
*/
private Shop[] shops;
private Order[] orders;
private Feedback[] feedbacks;
// 해당 변수를 제어하는 Idx변수를 정의하고 초기화
int shopIdx = 0;
int feedbackIdx = 0;
int orderIdx = 0;
private static Scanner s; // 사용자의 입력을 받는 객체 생성
public KDeliveryMain() {
this.s = new Scanner(System.in);
initValue();
}
/**
* @KDeliveryMainV1() : 매장 정보, 주문 정보, 리뷰 정보 초기화
* initValues() 메서드 사용
* */
/**
* @initValues() : 객체에 저장될 수 있는 크기 지정
* SHOP_MAX, ORDER_MAX, FEEDBACK_MAX = 5
* */
private void initValue() {
this.shops = new Shop[SHOP_MAX];
this.orders = new Order[ORDER_MAX];
this.feedbacks = new Feedback[FEEDBACK_MAX];
}
/**
* @close() : 프로그램 종료를 위해 사용되는 메서드
* 사용자가 종료를 선언하면 동작합니다.
* main()에서 활용됩니다.
* */
public void close() {
s.close();
}
/**
* selectMainMenu() : 기능을 나열하며, 사용자가 원하는 기능을 정수로 받습니다.
* */
public int selectMainMenu() {
System.out.println("[치킨의 민족 프로그램 V1]");
System.out.println("-".repeat(35));
System.out.println("1) [사장님 용] 음식점 등록하기");
System.out.println("2) [고객님과 사장님 용] 음식점 별점 조회하기");
System.out.println("3) [고객님 용] 음식 주문하기");
System.out.println("4) [고객님 용] 별점 등록하기");
System.out.println("5) 프로그램 종료하기");
System.out.println("-".repeat(35));
System.out.println("[시스템] 무엇을 도와드릴까요?");
return Integer.parseInt(s.nextLine());
}
/**
* @selectAddShopMenu() : 음식점의 정보를 등록합니다.
* @shops : 가게 정보를 저장합니다.
* @shopIdx : 가게 정보의 인덱스
* */
public void selectAddShopMenu() {
System.out.println("[안내] 반갑습니다, 가맹주님!");
System.out.println("[안내] 음식점 상호는 무엇인가요?");
System.out.print(">>>");
// 입력
String shopName = s.nextLine();
System.out.println("[안내] 대표 메뉴 이름은 무엇인가요?");
System.out.print(">>>");
// 입력
String foodName = s.nextLine();
System.out.println("[안내] 해당 메뉴 가격은 얼마인가요?");
System.out.print(">>>");
int price = Integer.parseInt(s.nextLine());
/**
* @Shop.java 의 Shop 클래스를 활용한 객체 생성
* @public 클래스 : 동일 패키지 및 다른 패키지에서 사용가능
* @addFood() : Shop.java 의 Shop 클래스의 addFood() 메서드
* 해당 메서드는 매장명, 음식명, 가격을 입력받아 객체에 저장
* 값이 저장될 때 마다 shopIdx 값 증가
*/
Shop shop = new Shop(shopName);
shop.addFood(foodName, price);
int currentIndex = isValidIndex(SHOP_MAX);
if (currentIndex != -1) {
shops[currentIndex] = new Shop(shopName);
shops[currentIndex].addFood(foodName, price);
System.out.printf("[안내] %s에 음식(%s, %d) 추가되었습니다.", shopName, foodName, price);
System.out.println("[시스템] 가게 등록이 정상 처리되었습니다.");
} else {
System.out.println("[시스템] 더 이상 새로운 가게를 추가할 수 없습니다.");
}
System.out.println("[안내] 노랑 통닭에 음식(노랑 치킨, 15000) 추가되었습니다.");
}
/**
* @selectDashboardMenu() : 해당 메서드는 등록된 가게 정보를 출력합니다.
* Feedback.java 파일의 클래스 및 메서드를 활용합니다.
* */
public void selectDashboardMenu() {
if (feedbacks.length == 0) {
System.out.println("[시스템] 현재 등록된 평가가 없습니다.");
}
for (Feedback feedback : feedbacks) {
feedback.printInfo();
}
}
/**
* @selectOrderMenu() : 주문 기능
* 사용자의 입력을 받아 orders 객체에 저장
* */
public void selectOrderMenu() {
System.out.println("[안내] 고객님! 메뉴 주문을 진행하겠습니다!");
System.out.println("[안내] 주문자 이름을 알려주세요!");
System.out.println(">>>");
// 사용자 이름 입력
String customerName = s.nextLine();
System.out.println("[안내] 주문할 음식점 상호는 무엇인가요?");
System.out.println(">>>");
// 음식점 이름 입력
String shopName = s.nextLine();
System.out.println("[안내] 주문할 메뉴 이름을 알려주세요!");
System.out.println(">>>");
// 메뉴 이름 입력
String foodName = s.nextLine();
Order order = new Order(customerName, shopName, foodName);
int currentIndex = isValidIndex(ORDER_MAX);
if (currentIndex != -1) {
orders[currentIndex] = order;
System.out.printf("[안내] %s님!", customerName);
System.out.printf("[안내] %s 매장에 %s 주문이 완료되었습니다.", shopName, customerName);
} else {
System.out.println("[시스템] 더 이상 주문을 할 수 없습니다.");
}
}
/**
* @selectFeedbackMenu() : 메뉴의 피드백을 입력받는 기능
* */
public void selectFeedbackMenu() {
System.out.println("[안내] 고객님! 별점 등록을 진행합니다.");
System.out.println("[안내] 주문자 이름은 무엇인가요?");
System.out.println(">>>");
// 주문자 이름 입력
String customerName = s.nextLine();
System.out.println("[안내] 음식점 상호는 무엇인가요?");
System.out.println(">>>");
// 음식점 이름 입력
String shopName = s.nextLine();
System.out.println("[안내] 주문하신 음식 이름은 무엇인가요?");
System.out.println(">>>");
// 메뉴 이름 입력
String foodName = s.nextLine();
System.out.println("[안내] 음식 맛은 어떠셨나요? (1점 ~ 5점)");
System.out.println(">>>");
// 별점 입력
int grade = Integer.parseInt(s.nextLine());
Feedback feedback = new Feedback(customerName, shopName, foodName, grade);
int currentIndex = isValidIndex(FEEDBACK_MAX);
if (currentIndex != -1) {
feedbacks[currentIndex] = feedback;
System.out.println("[안내] 리뷰 등록이 완료되었습니다.");
} else {
System.out.println("더 이상 리뷰를 등록할 수 없습니다.");
}
}
public static void main(String[] args) {
KDeliveryMain kDeliveryMain = new KDeliveryMain();
int count = 5;
do {
count = kDeliveryMain.selectMainMenu();
switch (count) {
case 1: kDeliveryMain.selectAddShopMenu();
break;
case 2: kDeliveryMain.selectDashboardMenu();
break;
case 3: kDeliveryMain.selectOrderMenu();
break;
case 4: kDeliveryMain.selectFeedbackMenu();
break;
}
} while(count != 5);
kDeliveryMain.close();
System.out.println("[안내] 이용해 주셔서 감사합니다.");
}
public int isValidIndex(int maxLength) {
int currentIdx = -1;
for (int i = 0; i < maxLength; i++) {
if (orders[i] == null) {
currentIdx = i;
}
}
return currentIdx;
}
}
ref v2
유효성 검증 추가
Feedback
package jungmin.ref.v2;
public class Feedback {
private String customerName;
private String shopName;
private String foodName;
private int grade;
/**
* @Feedback() : 정보를 저장합니다
*/
public Feedback(String customerName, String shopName, String foodName, int grade) {
this.customerName = customerName;
this.shopName = shopName;
this.foodName = foodName;
this.grade = grade;
}
public String getCustomerName() {
return customerName;
}
public String getShopName() {
return shopName;
}
public String getFoodName() {
return foodName;
}
/**
* @getStars() : 사용자가 입력한 점수가 별점(★★★★★)으로 전환'
*/
public String getGrade() {
String star = "";
for (int i = 0; i < this.grade; i++) {
star += "★";
}
return star;
}
/**
* @printInfo() : 출력
*/
public void printInfo() {
System.out.println(this.customerName + " [고객님]");
System.out.println("-".repeat(35));
System.out.println("주문 매장 : " + this.shopName);
System.out.println("주문 메뉴 : " + this.foodName);
System.out.println("별점 : " + getGrade());
}
}
Order
package jungmin.ref.v2;
public class Order {
private String customerName;
private String shopName;
private String foodName;
/**
*@Order():주문 정보를 저장합니다.
**/
public Order(String customerName, String shopName, String foodName) {
this.customerName = customerName;
this.shopName = shopName;
this.foodName = foodName;
}
public String getCustomerName() {
return customerName;
}
public String getShopName() {
return shopName;
}
public String getFoodName() {
return foodName;
}
}
Shop
package jungmin.ref.v2;
public class Shop {
/**
* 등록 가능한 음식 수, 음식 초기화 변수, 가격 필드 생성
* 매장명, 메뉴명, 가격 필드 생성
* */
private static final int FOOD_MAX = 5;
private static final String EMPTY_FOOD = "";
private static final int EMPTY_PRICE = 0;
private String shopName;
private String[] foodNames;
private int[] prices;
/**
* @Shop() : 생성자 정의
* 매장만 먼저 입력받도록 합니다.
* 나머지 변수는 initValues() 에서 정의합니다.
* */
public Shop(String shopName) {
this.shopName = shopName;
initValues();
}
// getter 임시로 체크용
public String getShopName() {
return shopName;
}
public String[] getFoodNames() {
return foodNames;
}
public int[] getPrices() {
return prices;
}
/**
* @initValues() : 메뉴명와 가격정보를 담는 배열 생성 및 초기화
* EMPTY_FOOD = "", EMPTY_PRICE = 0
*/
//상수에 들어있는 값을 가지고 초기화 , 생성자와 약간 다른 역할
private void initValues() {
foodNames = new String[FOOD_MAX];
prices = new int[FOOD_MAX];
for (int i = 0; i < foodNames.length; i++) {
foodNames[i] = EMPTY_FOOD;
}
}
/**
* @addFood() : 위 코드에서 정의된 변수를 받아 출력과 객체에 저장합니다.
*/
public void addFood(String foodName, int price) {
int currentIdx = -1;
for (int i = 0; i < foodNames.length; i++) {
if (foodNames[i].equals(foodName)) {
System.out.println("[시스템] 같은 이름의 상품은 등록할 수 없습니다.");
} else if (foodNames[i].equals("")) {
currentIdx = i;
break;
}
}
if (currentIdx != -1) {
foodNames[currentIdx] = foodName;
prices[currentIdx] = price;
} else {
// 예외일 경우
}
}
}
KDeliveryMain
package jungmin.ref.v2;
import jungmin.kdelivery.Feedback;
import jungmin.kdelivery.Order;
import jungmin.kdelivery.Shop;
import jungmin.kdelivery.helper.Printer;
import java.util.Arrays;
import java.util.Scanner;
// 클래스를 정의 합니다.
public class KDeliveryMain {
/**
* 음식점 등록 개수, 음식 주문 가능 횟수, 리뷰 등록 가능 횟수 정의
* */
private static int SHOP_MAX = 5;
private static int ORDER_MAX= 5;
private static int FEEDBACK_MAX = ORDER_MAX;
/**
* 배열을 담을 수 있는 객체 생성
* 사용 범위, 객체 타입, 객체 이름
*/
private Shop[] shops;
private Order[] orders;
private Feedback[] feedbacks;
// 해당 변수를 제어하는 Idx변수를 정의하고 초기화
int shopIdx = 0;
int feedbackIdx = 0;
int orderIdx = 0;
private static Scanner s; // 사용자의 입력을 받는 객체 생성
public KDeliveryMain() {
this.s = new Scanner(System.in);
initValue();
}
/**
* @KDeliveryMainV1() : 매장 정보, 주문 정보, 리뷰 정보 초기화
* initValues() 메서드 사용
* */
/**
* @initValues() : 객체에 저장될 수 있는 크기 지정
* SHOP_MAX, ORDER_MAX, FEEDBACK_MAX = 5
* */
private void initValue() {
this.shops = new Shop[SHOP_MAX];
this.orders = new Order[ORDER_MAX];
this.feedbacks = new Feedback[FEEDBACK_MAX];
}
/**
* @close() : 프로그램 종료를 위해 사용되는 메서드
* 사용자가 종료를 선언하면 동작합니다.
* main()에서 활용됩니다.
* */
public void close() {
s.close();
}
/**
* selectMainMenu() : 기능을 나열하며, 사용자가 원하는 기능을 정수로 받습니다.
* */
public int selectMainMenu() {
System.out.println("[치킨의 민족 프로그램 V1]");
System.out.println("-".repeat(35));
System.out.println("1) [사장님 용] 음식점 등록하기");
System.out.println("2) [고객님과 사장님 용] 음식점 별점 조회하기");
System.out.println("3) [고객님 용] 음식 주문하기");
System.out.println("4) [고객님 용] 별점 등록하기");
System.out.println("5) 프로그램 종료하기");
System.out.println("-".repeat(35));
System.out.println("[시스템] 무엇을 도와드릴까요?");
String choiceNumber = s.nextLine();
int choice = 6;
if (!isValidNumber(choiceNumber)) {
System.out.println("[시스템] 숫자만 입력해야 합니다.");
} else {
choice = Integer.parseInt(choiceNumber);
}
return Integer.parseInt(s.nextLine());
}
/**
* @selectAddShopMenu() : 음식점의 정보를 등록합니다.
* @shops : 가게 정보를 저장합니다.
* @shopIdx : 가게 정보의 인덱스
* */
public void selectAddShopMenu() {
System.out.println("[안내] 반갑습니다, 가맹주님!");
System.out.println("[안내] 음식점 상호는 무엇인가요?");
System.out.print(">>>");
// 입력
String shopName = s.nextLine();
System.out.println("[안내] 대표 메뉴 이름은 무엇인가요?");
System.out.print(">>>");
// 입력
String foodName = s.nextLine();
System.out.println("[안내] 해당 메뉴 가격은 얼마인가요?");
System.out.print(">>>");
// 입력
String priceStr = s.nextLine();
int price;
if (isValidNumber(priceStr)) {
price = Integer.parseInt(priceStr);
} else {
System.out.println("[시스템] 숫자만 입력해야 합니다.");
return;
}
/**
* @Shop.java 의 Shop 클래스를 활용한 객체 생성
* @public 클래스 : 동일 패키지 및 다른 패키지에서 사용가능
* @addFood() : Shop.java 의 Shop 클래스의 addFood() 메서드
* 해당 메서드는 매장명, 음식명, 가격을 입력받아 객체에 저장
* 값이 저장될 때 마다 shopIdx 값 증가
*/
Shop shop = new Shop(shopName);
shop.addFood(foodName, price);
int currentIndex = isValidIndex(shops);
if (currentIndex != -1) {
int shopIndex = getShopIndex(shops, currentIndex, shopName);
if (shopIndex != -1) {
Shop existShop = shops[shopIndex];
existShop.addFood(foodName, price);
} else {
shops[currentIndex] = new Shop(shopName);
shops[currentIndex].addFood(foodName, price);
}
System.out.printf("[안내] %s에 음식(%s, %d) 추가되었습니다.", shopName, foodName, price);
System.out.println("[시스템] 가게 등록이 정상 처리되었습니다.");
} else {
System.out.println("더 이상 추가할 수 없습니다.");
}
}
/**
* @selectDashboardMenu() : 해당 메서드는 등록된 가게 정보를 출력합니다.
* Feedback.java 파일의 클래스 및 메서드를 활용합니다.
* */
public void selectDashboardMenu() {
if (feedbacks.length == 0) {
System.out.println("[시스템] 현재 등록된 평가가 없습니다.");
}
for (Feedback feedback : feedbacks) {
feedback.printInfo();
}
}
/**
* @selectOrderMenu() : 주문 기능
* 사용자의 입력을 받아 orders 객체에 저장
* */
public void selectOrderMenu() {
System.out.println("[안내] 고객님! 메뉴 주문을 진행하겠습니다!");
System.out.println("[안내] 주문자 이름을 알려주세요!");
System.out.println(">>>");
// 사용자 이름 입력
String customerName = s.nextLine();
System.out.println("[안내] 주문할 음식점 상호는 무엇인가요?");
System.out.println(">>>");
// 음식점 이름 입력
String shopName = s.nextLine();
System.out.println("[안내] 주문할 메뉴 이름을 알려주세요!");
System.out.println(">>>");
// 메뉴 이름 입력
String foodName = s.nextLine();
int currentIndex = isValidIndex(orders);
if (currentIndex != -1) {
// shopName이 실제로 존재하는지 확인
// else 라면 아예 주문 자체가 불가능
int shopIndex = getShopIndex(shops, isValidIndex(shops), shopName);
if (getShopIndex(shops, isValidIndex(shops), shopName) != -1) {
// 이제는 상점은 찾았으니, 메뉴가 있는지 검증해야 합니다.
Order order = new Order(customerName, shopName, foodName);
orders[currentIndex] = order;
} else {
System.out.println("[시스템] 정확한 가게 이름을 입력해 주세요.");
return;
}
System.out.printf("[안내] %s님!", customerName);
System.out.printf("[안내] %s 매장에 %s 주문이 완료되었습니다.", shopName, customerName);
} else {
System.out.println("[시스템] 더 이상 주문을 할 수 없습니다.");
}
}
/**
* @selectFeedbackMenu() : 메뉴의 피드백을 입력받는 기능
* */
public void selectFeedbackMenu() {
System.out.println("[안내] 고객님! 별점 등록을 진행합니다.");
System.out.println("[안내] 주문자 이름은 무엇인가요?");
System.out.println(">>>");
// 주문자 이름 입력
String customerName = s.nextLine();
System.out.println("[안내] 음식점 상호는 무엇인가요?");
System.out.println(">>>");
// 음식점 이름 입력
String shopName = s.nextLine();
System.out.println("[안내] 주문하신 음식 이름은 무엇인가요?");
System.out.println(">>>");
// 메뉴 이름 입력
String foodName = s.nextLine();
if(isExistOrder(orders, customerName, shopName, foodName)) {
System.out.println("[시스템] 주문을 다시 확인해주세요.");
return;
}
System.out.println("[안내] 음식 맛은 어떠셨나요? (1점 ~ 5점)");
System.out.println(">>>");
// 별점 입력
int grade = Integer.parseInt(s.nextLine());
Feedback feedback = new Feedback(customerName, shopName, foodName, grade);
int currentIndex = isValidIndex(feedbacks);
if (currentIndex != -1) {
feedbacks[currentIndex] = feedback;
System.out.println("[안내] 리뷰 등록이 완료되었습니다.");
} else {
System.out.println("더 이상 리뷰를 등록할 수 없습니다.");
}
}
public static void main(String[] args) {
KDeliveryMain kDeliveryMain = new KDeliveryMain();
int count = 5;
do {
count = kDeliveryMain.selectMainMenu();
switch (count) {
case 1: kDeliveryMain.selectAddShopMenu();
break;
case 2: kDeliveryMain.selectDashboardMenu();
break;
case 3: kDeliveryMain.selectOrderMenu();
break;
case 4: kDeliveryMain.selectFeedbackMenu();
break;
case 5: {
System.out.println("아래는 상점 목록입니다.");
System.out.println(Arrays.toString(kDeliveryMain.shops));
for (Shop shop : kDeliveryMain.shops) {
}
}
}
} while(count != 5);
kDeliveryMain.close();
System.out.println("[안내] 이용해 주셔서 감사합니다.");
}
public int isValidIndex(Object[] arr) {
int currentIdx = -1;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == null) {
return i;
}
}
return currentIdx;
}
public int getShopIndex(Shop[] arr, int maxLength, String shopName) {
int currentIdx = -1;
for (int i = 0; i < maxLength; i++) {
if (arr[i].getShopName().equals(shopName)) {
return i;
}
}
return maxLength;
}
public boolean isExistMenuName(Shop shop, String foodName) {
String[] menuArr = shop.getFoodNames();
for (String str : menuArr) {
if(str.equals(foodName)) {
return true;
}
}
return false;
}
public boolean isExistOrder(Order[] orderArr, String customerName, String shopName, String foodName) {
for (Order order : orderArr) {
if (order == null) {
return false;
} else {
if (order.getShopName().equals(shopName) &&
order.getCustomerName().equals(customerName) &&
order.getFoodName().equals(foodName)) {
return false;
}
}
}
return false;
}
public boolean isValidNumber(String str) {
char[] arr = str.toCharArray();
String table = "0123456789";
for (int i = 0; i < arr.length; i++) {
if (table.indexOf(arr[i]) == -1) return false;
}
return true;
}
}
ref v3
리스트, 맵으로 변환
Feedback
package jungmin.ref.v3;
public class Feedback {
private String customerName;
private String shopName;
private String foodName;
private int grade;
/**
* @Feedback() : 정보를 저장합니다
*/
public Feedback(String customerName, String shopName, String foodName, int grade) {
this.customerName = customerName;
this.shopName = shopName;
this.foodName = foodName;
this.grade = grade;
}
public String getCustomerName() {
return customerName;
}
public String getShopName() {
return shopName;
}
public String getFoodName() {
return foodName;
}
/**
* @getStars() : 사용자가 입력한 점수가 별점(★★★★★)으로 전환'
*/
public String getGrade() {
String star = "";
for (int i = 0; i < this.grade; i++) {
star += "★";
}
return star;
}
/**
* @printInfo() : 출력
*/
public void printInfo() {
System.out.println(this.customerName + " [고객님]");
System.out.println("-".repeat(35));
System.out.println("주문 매장 : " + this.shopName);
System.out.println("주문 메뉴 : " + this.foodName);
System.out.println("별점 : " + getGrade());
}
}
Order
package jungmin.ref.v3;
public class Order {
private String customerName;
private String shopName;
private String foodName;
/**
*@Order():주문 정보를 저장합니다.
**/
public Order(String customerName, String shopName, String foodName) {
this.customerName = customerName;
this.shopName = shopName;
this.foodName = foodName;
}
public String getCustomerName() {
return customerName;
}
public String getShopName() {
return shopName;
}
public String getFoodName() {
return foodName;
}
public boolean isExistOrder(jungmin.kdelivery.Order[] orderArr, String customerName, String shopName, String foodName) {
return this.customerName.equals(customerName) &&
this.shopName.equals(shopName) &&
this.foodName.equals(foodName);
}
}
Shop
package jungmin.ref.v3;
import java.util.*;
public class Shop {
/**
* 등록 가능한 음식 수, 음식 초기화 변수, 가격 필드 생성
* 매장명, 메뉴명, 가격 필드 생성
* */
// private static final int FOOD_MAX = 5;
// private static final String EMPTY_FOOD = "";
// private static final int EMPTY_PRICE = 0;
private String shopName;
private String[] foodNames;
private int[] prices;
private Map<String, Integer> menus = new HashMap<>();
/**
* @Shop() : 생성자 정의
* 매장만 먼저 입력받도록 합니다.
* 나머지 변수는 initValues() 에서 정의합니다.
* */
// getter 임시로 체크용
public String getShopName() {
return shopName;
}
public Shop(Map<String, Integer> menus) {
this.menus = menus;
}
/**
* @addFood() : 위 코드에서 정의된 변수를 받아 출력과 객체에 저장합니다.
*/
public boolean addFood(String foodName, int price) {
// 메뉴를 추가하는 역할
// 자기 자신(객체)에게 추가해야 함
// 기존에는 중복도 거르고, NULL 혹은 비어있는 가장 앞의 인덱스를 찾아서 저장해야 했으나,
// 맵을 사용하면 그런걸 고려할 필요 X
// 중복은 맵에서 키는 중복 허용이 안되고,
// 크기가 고정되어 있지 않기 때문에 전부 다 무시해도 됨
if (menus.containsKey(foodName)) {
return false;
} else {
menus.put(foodName, price);
return true;
}
}
public boolean isExistMenu(String foodName) {
return menus.containsKey(foodName);
}
}
KDeliveryMain
package jungmin.ref.v3;
import jungmin.kdelivery.Feedback;
import jungmin.kdelivery.Order;
import jungmin.kdelivery.Shop;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
// 클래스를 정의 합니다.
public class KDeliveryMain {
/**
* 음식점 등록 개수, 음식 주문 가능 횟수, 리뷰 등록 가능 횟수 정의
* */
private static int SHOP_MAX = 5;
private static int ORDER_MAX= 5;
private static int FEEDBACK_MAX = ORDER_MAX;
/**
* 배열을 담을 수 있는 객체 생성
* 사용 범위, 객체 타입, 객체 이름
*/
private Shop[] shops;
private Order[] orders;
private Feedback[] feedbacks;
// 해당 변수를 제어하는 Idx변수를 정의하고 초기화
int shopIdx = 0;
int feedbackIdx = 0;
int orderIdx = 0;
private static Scanner s; // 사용자의 입력을 받는 객체 생성
public KDeliveryMain() {
this.s = new Scanner(System.in);
initValue();
}
/**
* @KDeliveryMainV1() : 매장 정보, 주문 정보, 리뷰 정보 초기화
* initValues() 메서드 사용
* */
/**
* @initValues() : 객체에 저장될 수 있는 크기 지정
* SHOP_MAX, ORDER_MAX, FEEDBACK_MAX = 5
* */
private void initValue() {
this.shops = new Shop[SHOP_MAX];
this.orders = new Order[ORDER_MAX];
this.feedbacks = new Feedback[FEEDBACK_MAX];
}
/**
* @close() : 프로그램 종료를 위해 사용되는 메서드
* 사용자가 종료를 선언하면 동작합니다.
* main()에서 활용됩니다.
* */
public void close() {
s.close();
}
/**
* selectMainMenu() : 기능을 나열하며, 사용자가 원하는 기능을 정수로 받습니다.
* */
public int selectMainMenu() {
System.out.println("[치킨의 민족 프로그램 V1]");
System.out.println("-".repeat(35));
System.out.println("1) [사장님 용] 음식점 등록하기");
System.out.println("2) [고객님과 사장님 용] 음식점 별점 조회하기");
System.out.println("3) [고객님 용] 음식 주문하기");
System.out.println("4) [고객님 용] 별점 등록하기");
System.out.println("5) 프로그램 종료하기");
System.out.println("-".repeat(35));
System.out.println("[시스템] 무엇을 도와드릴까요?");
String choiceNumber = s.nextLine();
int choice = 6;
if (!isValidNumber(choiceNumber)) {
System.out.println("[시스템] 숫자만 입력해야 합니다.");
} else {
choice = Integer.parseInt(choiceNumber);
}
return Integer.parseInt(s.nextLine());
}
/**
* @selectAddShopMenu() : 음식점의 정보를 등록합니다.
* @shops : 가게 정보를 저장합니다.
* @shopIdx : 가게 정보의 인덱스
* */
public void selectAddShopMenu() {
System.out.println("[안내] 반갑습니다, 가맹주님!");
System.out.println("[안내] 음식점 상호는 무엇인가요?");
System.out.print(">>>");
// 입력
String shopName = s.nextLine();
System.out.println("[안내] 대표 메뉴 이름은 무엇인가요?");
System.out.print(">>>");
// 입력
String foodName = s.nextLine();
System.out.println("[안내] 해당 메뉴 가격은 얼마인가요?");
System.out.print(">>>");
// 입력
String priceStr = s.nextLine();
int price;
if (isValidNumber(priceStr)) {
price = Integer.parseInt(priceStr);
} else {
System.out.println("[시스템] 숫자만 입력해야 합니다.");
return;
}
/**
* @Shop.java 의 Shop 클래스를 활용한 객체 생성
* @public 클래스 : 동일 패키지 및 다른 패키지에서 사용가능
* @addFood() : Shop.java 의 Shop 클래스의 addFood() 메서드
* 해당 메서드는 매장명, 음식명, 가격을 입력받아 객체에 저장
* 값이 저장될 때 마다 shopIdx 값 증가
*/
Shop shop = new Shop(shopName);
shop.addFood(foodName, price);
int shopIndex = getShopIndex(shops, shopName);
if (shopIndex != -1) {
Shop existShop = shops.get(shopIndex);
if(!shops.get(shopIndex).addFood(foodName, price)) {
System.out.println("[시스템] 동일한 이름의 메뉴를 추가할 수 없습니다.");
}
} else {
Shop shop = new Shop(shopName);
shop.addFood(foodName, price);
shops.add(shop);
}
System.out.printf("[안내] %s에 음식(%s, %d) 추가되었습니다.", shopName, foodName, price);
System.out.println("[시스템] 가게 등록이 정상 처리되었습니다.");
}
/**
* @selectDashboardMenu() : 해당 메서드는 등록된 가게 정보를 출력합니다.
* Feedback.java 파일의 클래스 및 메서드를 활용합니다.
* */
public void selectDashboardMenu() {
if (feedbacks.length == 0) {
System.out.println("[시스템] 현재 등록된 평가가 없습니다.");
}
for (Feedback feedback : feedbacks) {
feedback.printInfo();
}
}
/**
* @selectOrderMenu() : 주문 기능
* 사용자의 입력을 받아 orders 객체에 저장
* */
public void selectOrderMenu() {
System.out.println("[안내] 고객님! 메뉴 주문을 진행하겠습니다!");
System.out.println("[안내] 주문자 이름을 알려주세요!");
System.out.println(">>>");
// 사용자 이름 입력
String customerName = s.nextLine();
System.out.println("[안내] 주문할 음식점 상호는 무엇인가요?");
System.out.println(">>>");
// 음식점 이름 입력
String shopName = s.nextLine();
System.out.println("[안내] 주문할 메뉴 이름을 알려주세요!");
System.out.println(">>>");
// 메뉴 이름 입력
String foodName = s.nextLine();
int currentIndex = isValidIndex(orders);
if (currentIndex != -1) {
// shopName이 실제로 존재하는지 확인
// else 라면 아예 주문 자체가 불가능
int shopIndex = getShopIndex(shops, shopName);
if (getShopIndex(shops, isValidIndex(shops), shopName) != -1) {
// 이제는 상점은 찾았으니, 메뉴가 있는지 검증해야 합니다.
Order order = new Order(customerName, shopName, foodName);
orders.add(order);
} else {
System.out.println("[시스템] 정확한 가게 이름을 입력해 주세요.");
return;
}
System.out.printf("[안내] %s님!", customerName);
System.out.printf("[안내] %s 매장에 %s 주문이 완료되었습니다.", shopName, customerName);
} else {
System.out.println("[시스템] 해당 점포가 존재하지 않습니다.");
}
}
/**
* @selectFeedbackMenu() : 메뉴의 피드백을 입력받는 기능
* */
public void selectFeedbackMenu() {
System.out.println("[안내] 고객님! 별점 등록을 진행합니다.");
System.out.println("[안내] 주문자 이름은 무엇인가요?");
System.out.println(">>>");
// 주문자 이름 입력
String customerName = s.nextLine();
System.out.println("[안내] 음식점 상호는 무엇인가요?");
System.out.println(">>>");
// 음식점 이름 입력
String shopName = s.nextLine();
System.out.println("[안내] 주문하신 음식 이름은 무엇인가요?");
System.out.println(">>>");
// 메뉴 이름 입력
String foodName = s.nextLine();
boolean isChecked = false;
for (Order order : orders) {
if (order.isExistOrder(customerName, shopName, foodName)) {
//일치하는 영수증이 있을 경우
isChecked = true;
}
}
if(!isChecked) {
System.out.println("[시스템] 주문을 다시 확인해주세요.");
return;
}
System.out.println("[안내] 음식 맛은 어떠셨나요? (1점 ~ 5점)");
System.out.println(">>>");
// 별점 입력
int grade = Integer.parseInt(s.nextLine());
Feedback feedback = new Feedback(customerName, shopName, foodName, grade);
feedback.add(feedback);
int currentIndex = isValidIndex(feedbacks);
if (currentIndex != -1) {
feedbacks[currentIndex] = feedback;
System.out.println("[안내] 리뷰 등록이 완료되었습니다.");
} else {
System.out.println("더 이상 리뷰를 등록할 수 없습니다.");
}
}
public static void main(String[] args) {
KDeliveryMain kDeliveryMain = new KDeliveryMain();
int count = 5;
do {
count = kDeliveryMain.selectMainMenu();
switch (count) {
case 1: kDeliveryMain.selectAddShopMenu();
break;
case 2: kDeliveryMain.selectDashboardMenu();
break;
case 3: kDeliveryMain.selectOrderMenu();
break;
case 4: kDeliveryMain.selectFeedbackMenu();
break;
case 5: {
System.out.println("아래는 상점 목록입니다.");
System.out.println(Arrays.toString(kDeliveryMain.shops));
for (Shop shop : kDeliveryMain.shops) {
}
}
}
} while(count != 5);
kDeliveryMain.close();
System.out.println("[안내] 이용해 주셔서 감사합니다.");
}
public int isValidIndex(Object[] arr) {
int currentIdx = -1;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == null) {
return i;
}
}
return currentIdx;
}
public int getShopIndex(ArrayList<Shop> shopList, String shopName) {
int currentIdx = -1;
for (int i = 0; i < shopList.size(); i++) {
if (shopList.get(i).getShopName().equals(shopName)) {
return i;
}
}
return currentIdx;
}
public boolean isValidNumber(String str) {
if (str.isEmpty()) return false;
char[] arr = str.toCharArray();
String table = "0123456789";
for (int i = 0; i < arr.length; i++) {
if (table.indexOf(arr[i]) == -1) return false;
}
return true;
}
}
평가 과제
💡 편의점 발주 프로그램 만들기 본 예제는 편의점, 음식점, 카페 등 저장 공간을 가지고 있는 곳이라면 자유롭게 사용할 수 있는 발주 프로그램을 제작하여 봅니다. 해당 프로그램은 물건을 등록하거나 빼는 등의 기본적인 기능만을 갖도록 합니다. (※ 반드시 객체 지향을 알아야만 JAVA로 프로그램을 짤 수 있는 것은 아닙니다. 기본 타입, 제어문, 함수, String을 활용해 작은 프로그램을 만들 수 있습니다. )
🖥 [편의점 발주 프로그램] 출력 예시
------------------------------
[System] 점장님 어서오세요.
[System] 해당 프로그램의 기능입니다.
1. 물건 정보(제품명) 등록하기
2. 물건 정보(제품명) 등록 취소하기
3. 물건 넣기 (제품 입고)
4. 물건 빼기 (제품 출고)
5. 재고 조회
6. 프로그램 종료
------------------------------
[System] 원하는 기능의 번호를 입력하세요 : 1
[System] 제품 등록을 원하는 제품명을 입력하세요 : 사이다
[System] 등록이 완료됬습니다.
[System] 현재 등록된 제품 목록 ▼
> 사이다
> 등록 가능
> 등록 가능
> 등록 가능
> 등록 가능
------------------------------
1. 물건 정보(제품명) 등록하기
2. 물건 정보(제품명) 등록 취소하기
3. 물건 넣기 (제품 입고)
4. 물건 빼기 (제품 출고)
5. 재고 조회
6. 프로그램 종료
------------------------------
[System] 원하는 기능의 번호를 입력하세요 : 3
[System] 물건의 수량을 추가합니다.(입고)
[System] 현재 등록된 제품 및 수량 ▼
> 사이다 : 0개
> 등록 가능 : 0개
> 등록 가능 : 0개
> 등록 가능 : 0개
> 등록 가능 : 0개
[System] 수량을 추가할 제품명을 입력하세요 : 사이다
[System] 추가할 수량을 입력해주세요 : 100
[Clear] 정상적으로 제품의 수량 추가가 완료되었습니다.
[System] 현재 등록된 제품 및 수량 ▼
> 사이다 : 100개
> 등록 가능 : 0개
> 등록 가능 : 0개
> 등록 가능 : 0개
> 등록 가능 : 0개
------------------------------
1. 물건 정보(제품명) 등록하기
2. 물건 정보(제품명) 등록 취소하기
3. 물건 넣기 (제품 입고)
4. 물건 빼기 (제품 출고)
5. 재고 조회
6. 프로그램 종료
------------------------------
[System] 원하는 기능의 번호를 입력하세요 : 4
[System] 제품의 출고를 진행합니다.
[System] 현재 등록된 물건 목록 및 수량 ▼
> 사이다 : 100개
> 등록 가능 : 0개
> 등록 가능 : 0개
> 등록 가능 : 0개
> 등록 가능 : 0개
[System] 출고를 진행할 제품명을 입력하세요 : 사이다
[System] 원하는 출고량을 입력하세요 : 100
[Clear] 출고가 완료되었습니다.
[System] 현재 등록된 제품 및 수량 ▼
> 사이다 : 0개
> 등록 가능 : 0개
> 등록 가능 : 0개
> 등록 가능 : 0개
> 등록 가능 : 0개
1. 물건 정보(제품명) 등록하기
2. 물건 정보(제품명) 등록 취소하기
3. 물건 넣기 (제품 입고)
4. 물건 빼기 (제품 출고)
5. 재고 조회
6. 프로그램 종료
------------------------------
[System] 원하는 기능의 번호를 입력하세요 : 2
[System] 제품 등록 취소를 원하는 제품명을 입력하세요 : 사이다
[System] 제품 취소가 완료됬습니다.
1. 물건 정보(제품명) 등록하기
2. 물건 정보(제품명) 등록 취소하기
3. 물건 넣기 (제품 입고)
4. 물건 빼기 (제품 출고)
5. 재고 조회
6. 프로그램 종료
------------------------------
[System] 원하는 기능의 번호를 입력하세요 : 5
[System] 현재 등록된 물건 목록 ▼
> 등록 가능 : 0개
> 등록 가능 : 0개
> 등록 가능 : 0개
> 등록 가능 : 0개
> 등록 가능 : 0개
1. 물건 정보(제품명) 등록하기
2. 물건 정보(제품명) 등록 취소하기
3. 물건 넣기 (제품 입고)
4. 물건 빼기 (제품 출고)
5. 재고 조회
6. 프로그램 종료
------------------------------
[System] 원하는 기능의 번호를 입력하세요 : 6
[System] 프로그램을 종료합니다.
[System] 감사합니다.
💡 [CuGs7 점장님]이 보내온 프로그래밍 요청서
✏️ [편의점에서 활용할 수 있는 프로그램 기능]본 프로그램은 아래와 같이 여섯 가지 기능을 추가해 주세요.
- 물건 정보(제품명) 등록하기
1.1 제품이 등록되면 새롭게 추가된 상품의 갯수는 항상 0개여야 합니다.
- 물건 정보(제품명) 등록 취소하기
2.1 제품이 삭제되면 삭제된 제품과 동일한 인덱스의 count는 항상 0으로 변경되어야 합니다.
물건 넣기 (제품 입고) → 등록된 제품 수량 증가
3.1 유효성 검증 로직을 추가해야 합니다. (숫자가 아닌 입력이 발생할 시, 아래와 같이 출력하고 다시 입력이 이루어져야 합니다.
[Error] 수량은 숫자로 입력해야 합니다.
- 물건 빼기 (제품 출고) → 등록된 제품 수량 차감
4.1 유효성 검증 로직을 추가해야 합니다. (숫자가 아닌 입력이 발생할 시, 아래와 같이 출력하고 다시 입력이 이루어져야 합니다.
[Error] 수량은 숫자로 입력해야 합니다.
5. 재고 조회 6. 프로그램 종료 (※ 프로그램 종료 기능을 실행하지 않는 한 계속해서 프로그램이 돌아갈 수 있도록 합니다.)
MyStorage
package com.choongang; // 패키지 선언, 해당 클래스를 com.choongang 패키지에 속하게 합니다.
import java.util.Scanner; // Scanner 클래스를 사용하기 위해 java.util 패키지에서 가져옵니다.
public class MyStorage {
// 'EMPTY'는 빈 제품 위치를 나타내는 상수로, '등록 가능' 문자열을 저장하고 있습니다.
public final static String EMPTY = "등록 가능";
// product는 현재 등록된 제품을 저장하는 배열입니다.
static String[] products = new String[]{EMPTY,EMPTY,EMPTY,EMPTY,EMPTY};
// counts는 제품의 수량을 저장하는 배열입니다.
static int[] counts = new int[]{0, 0, 0, 0, 0};
/**
* 메뉴 옵션을 화면에 표시하는 메서드입니다.
* 반환 타입은 void로, 별도의 반환 값이 없습니다.
*/
public static void showMenu(){
System.out.println("1. 물건 정보(제품명) 등록하기");
System.out.println("2. 물건 정보(제품명) 등록 취소하기");
System.out.println("3. 물건 넣기 (제품 입고)");
System.out.println("4. 물건 빼기 (제품 출고)");
System.out.println("5. 재고 조회");
System.out.println("6. 프로그램 종료");
System.out.println("-".repeat(30)); // '-' 문자를 30번 반복하여 줄을 그어 메뉴 구분을 명확하게 합니다.
}
/**
* 사용자로부터 선택된 메뉴 번호를 입력 받아 반환하는 메서드입니다.
* @param s Scanner 객체, 사용자로부터 입력을 받기 위해 사용됩니다.
* @return int 메뉴 번호를 정수 형태로 반환합니다.
*/
public static int selectMenu(Scanner s){
System.out.print("[System] 원하는 기능의 번호를 입력하세요 : ");
int select = Integer.parseInt(s.nextLine()); // 사용자로부터 정수 입력을 받아 변수 select에 저장합니다.
return select; // 입력 받은 정수를 반환합니다.
}
/**
* 제품을 등록하는 메서드입니다.
* @param s Scanner 객체, 사용자로부터 제품명 입력을 받기 위해 사용됩니다.
* 반환 타입은 void로, 별도의 반환 값이 없습니다.
* 제품의 이름을 입력받아, products 배열에 할당합니다.
*/
static void prod_input(Scanner s){
// 제품 등록 로직을 구현합니다. 제품명을 입력받아 빈 배열 위치에 저장합니다.
// TODO:
System.out.print("[System] 제품 등록을 원하는 제품명을 입력하세요 : ");
String menuName = s.nextLine();
System.out.println("[System] 등록이 완료됬습니다.");
for (int i = 0; i < products.length; i++) {
if(products[i].equals(EMPTY)) {
products[i] = menuName;
System.out.println("[System] 현재 등록된 제품 목록 ▼");
for (int j = 0; j < products.length; j++) {
System.out.println("> " + products[j]);
}
return;
}
}
}
/**
* 제품 등록을 취소하는 메서드입니다.
* @param s Scanner 객체, 사용자로부터 취소할 제품명 입력을 받기 위해 사용됩니다.
* 반환 타입은 void로, 별도의 반환 값이 없습니다.
* 제품의 이름을 입력받아, products의 배열에서 요소를 초기화합니다 ("등록 가능"으로 변경)
* 해당 제품의 수량도 0으로 변경해야 합니다. (counts 배열의 같은 index의 값을 0으로 변경합니다)
*/
static void prod_remove(Scanner s){
// 제품 등록 취소 로직을 구현합니다. 입력받은 제품명에 해당하는 배열 요소를 EMPTY로 설정합니다.
// TODO:
System.out.print("[System] 제품 등록 취소를 원하는 제품명을 입력하세요 : ");
String removeItem = s.nextLine();
for (int i = 0; i < products.length; i++) {
if (products[i].equals(removeItem)) {
products[i] = EMPTY;
System.out.println("[System] 제품 취소가 완료됬습니다.");
}
}
}
/**
* 제품 수량을 증가시키는 메서드입니다.
* @param s Scanner 객체를 통해 사용자로부터 제품명과 수량 입력을 받습니다.
* products 배열에서 입력받은 요소를 찾아내어. counts 배열에서 해당 제품의 수량을 입력받은 수 만큼 증가시킵니다.
* 반환 타입은 void로, 별도의 반환 값이 없습니다.
*/
public static void prod_amount_add(Scanner s) {
System.out.println("[System] 물건의 수량을 추가합니다.(입고)");
System.out.print("[System] 수량을 추가할 제품명을 입력하세요 : ");
String input = s.nextLine(); // 제품명 입력 받기
int foundIdx = -1; // 찾은 인덱스 초기화
for (int i = 0; i < products.length; ++i){
if (input.equals(products[i])){ // 입력한 제품명과 일치하는 제품을 찾으면
foundIdx = i; // 인덱스 저장
break; // 반복 중단
}
}
if (foundIdx < 0){ // 제품을 찾지 못한 경우
System.out.println("[Warning] 입력한 제품명이 없습니다. 다시 확인하여 주세요.");
return;
}
System.out.print("[System] 추가할 수량을 입력해주세요 : ");
String addNum = s.nextLine();
// 숫자가 아닌 경우, 에러 메시지를 출력해야 합니다. (유효성 검증)
// TODO:
if(!addNum.matches("\\d*")) {
System.out.println("숫자만 입력해야 합니다.");
return;
}
if (Integer.parseInt(addNum) < counts[0]) {
int cnt = Integer.parseInt(addNum); // 수량 입력 받기 (s.nextLine() 빼기)
counts[foundIdx] += cnt; // 제품의 수량을 증가
}
System.out.println("[Clear] 정상적으로 제품의 수량 추가가 완료되었습니다.");
}
/**
* 제품 수량을 감소시키는 메서드입니다.
* @param s Scanner 객체를 통해 사용자로부터 제품명과 수량 입력을 받습니다.
* products 배열에서 입력받은 요소를 찾아내어.
* counts 배열에서 해당 제품의 수량을 입력받은 수 만큼 감소시킵니다.
* 반환 타입은 void로, 별도의 반환 값이 없습니다.
*/
public static void prod_amount_decrease(Scanner s) {
// 제품 수량 감축 로직을 구현합니다. 입력받은 수량만큼 해당 제품의 수량을 감소시킵니다. (add에서 수정 / 100개인데 101개 못 뺌)
// TODO:
System.out.println("[System] 제품의 출고를 진행합니다.");
for (int i = 0; i < products.length; i++) {
System.out.println("> " + products[0] + " : " + counts[i] + "개");
}
System.out.print("[System] 출고를 진행할 제품명을 입력하세요 : ");
String input = s.nextLine(); // 제품명 입력 받기
int foundIdx = -1; // 찾은 인덱스 초기화
for (int i = 0; i < products.length; ++i){
if (input.equals(products[i])){ // 입력한 제품명과 일치하는 제품을 찾으면
foundIdx = i; // 인덱스 저장
break; // 반복 중단
}
}
if (foundIdx < 0){ // 제품을 찾지 못한 경우
System.out.println("[Warning] 입력한 제품명이 없습니다. 다시 확인하여 주세요.");
return;
}
System.out.print("[System] 원하는 출고량을 입력해주세요 : ");
String addNum = s.nextLine();
// 숫자가 아닌 경우, 에러 메시지를 출력해야 합니다. (유효성 검증)
// TODO:
if(!addNum.matches("\\d*")) {
System.out.println("숫자만 입력해야 합니다.");
return;
}
if (Integer.parseInt(addNum) < counts[0]) {
int cnt = Integer.parseInt(addNum); // 수량 입력 받기 (s.nextLine() 빼기)
counts[foundIdx] -= cnt; // 제품의 수량을 감소
}
System.out.println("[Clear] 정상적으로 제품의 수량 감소가 완료되었습니다.");
}
/**
* 등록된 모든 제품의 목록과 수량을 출력하는 메서드입니다.
* 반환 타입은 void로, 별도의 반환 값이 없습니다.
*/
static void prod_search(){
System.out.println("[System] 현재 등록된 물건 목록 ▼");
for (int i = 0; i < products.length; ++i){
System.out.println("> " + products[i] + " : " + counts[i] + "개");
}
}
/**
* 프로그램의 메인 메서드로, 프로그램의 실행 시작점입니다.
*/
public static void main(String[] args){
System.out.println("[Item_Storage]");
System.out.printf("[System] 점장님 어서오세요.\n[System] 해당 프로그램의 기능입니다.\n");
Scanner s = new Scanner(System.in);
while (true){
showMenu();
int menu = selectMenu(s); // 메뉴 선택을 받습니다.
if(menu == 6){ // '프로그램 종료' 선택 시
System.out.println("[System] 프로그램을 종료합니다.");
break; // 반복문을 종료하고 프로그램을 종료합니다.
}
// 선택된 메뉴에 따라 해당 기능을 실행합니다.
switch (menu){
case 1:
prod_input(s);
break;
case 2:
prod_remove(s);
break;
case 3:
prod_amount_add(s);
break;
case 4:
prod_amount_decrease(s);
break;
case 5:
prod_search();
break;
default:
System.out.println("[System] 시스템 번호를 다시 확인하여 주세요.");
}
}
s.close(); // Scanner 객체를 닫습니다.
}
}
MyStorageTest
package com.choongang;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
import java.io.ByteArrayInputStream;
import java.util.Scanner;
public class MyStorageTest {
private MyStorage storage;
@BeforeEach
void setUp() {
storage = new MyStorage();
// 배열을 초기 상태로 설정
for (int i = 0; i < MyStorage.products.length; i++) {
MyStorage.products[i] = MyStorage.EMPTY;
MyStorage.counts[i] = 0;
}
}
@Test
@DisplayName("제품 등록 메서드 테스트(prodInput)가 올바르게 제품을 추가해야 합니다.")
void testProdInput() {
String input = "TestProduct\n";
System.setIn(new ByteArrayInputStream(input.getBytes()));
Scanner scanner = new Scanner(System.in);
storage.prod_input(scanner);
assertEquals("TestProduct", MyStorage.products[0], "제품이 올바르게 등록되어야 합니다.");
}
@Test
@DisplayName("제품 삭제 메서드 테스트(prodRemove)가 올바르게 제품을 제거해야 합니다.")
void testProdRemove() {
MyStorage.products[0] = "TestProduct";
String input = "TestProduct\n";
System.setIn(new ByteArrayInputStream(input.getBytes()));
Scanner scanner = new Scanner(System.in);
storage.prod_remove(scanner);
assertEquals(MyStorage.EMPTY, MyStorage.products[0], "제품이 올바르게 제거되어야 합니다.");
}
@Test
@DisplayName("제품 수량 증가 메서드 테스트(prodAmountAdd)가 올바르게 수량을 증가시켜야 합니다.")
void testProdAmountAdd() {
MyStorage.products[0] = "TestProduct";
MyStorage.counts[0] = 5;
String input = "TestProduct\n3\n";
System.setIn(new ByteArrayInputStream(input.getBytes()));
Scanner scanner = new Scanner(System.in);
storage.prod_amount_add(scanner);
assertEquals(8, MyStorage.counts[0], "제품 수량이 올바르게 증가되어야 합니다.");
}
@Test
@DisplayName("제품 수량 감소 메서드 테스트(prodAmountDecrease)가 올바르게 수량을 감소시켜야 합니다.")
void testProdAmountDecrease() {
MyStorage.products[0] = "TestProduct";
MyStorage.counts[0] = 10;
String input = "TestProduct\n5\n";
System.setIn(new ByteArrayInputStream(input.getBytes()));
Scanner scanner = new Scanner(System.in);
storage.prod_amount_decrease(scanner);
assertEquals(5, MyStorage.counts[0], "제품 수량이 올바르게 감소되어야 합니다.");
}
@Test
@DisplayName("수량 증가 메서드에서 유효성 검증 테스트(숫자가 아닐 경우)")
void testProdAmountAddWithInvalidInput() {
MyStorage.products[0] = "TestProduct";
MyStorage.counts[0] = 5;
String input = "TestProduct\nabc\n";
System.setIn(new ByteArrayInputStream(input.getBytes()));
Scanner scanner = new Scanner(System.in);
storage.prod_amount_add(scanner);
assertEquals(5, MyStorage.counts[0], "유효하지 않은 입력으로 수량이 변경되지 않아야 합니다.");
}
@Test
@DisplayName("수량 감소 메서드에서 유효성 검증 테스트(숫자가 아닐 경우)")
void testProdAmountDecreaseWithInvalidInput() {
MyStorage.products[0] = "TestProduct";
MyStorage.counts[0] = 10;
String input = "TestProduct\nxyz\n";
System.setIn(new ByteArrayInputStream(input.getBytes()));
Scanner scanner = new Scanner(System.in);
storage.prod_amount_decrease(scanner);
assertEquals(10, MyStorage.counts[0], "유효하지 않은 입력으로 수량이 변경되지 않아야 합니다.");
}
@Test
@DisplayName("남은 수량보다 더 많이 출고할 수 없습니다.")
void testProdAmountDecreaseExceedingStock() {
MyStorage.products[0] = "TestProduct";
MyStorage.counts[0] = 5; // 현재 수량을 5로 설정
// 제품 이름과 초과하는 출고량
String input = "TestProduct\n10\n";
System.setIn(new ByteArrayInputStream(input.getBytes()));
Scanner scanner = new Scanner(System.in);
storage.prod_amount_decrease(scanner);
assertEquals(5, MyStorage.counts[0], "출고량이 초과되었을 때 수량이 변경되지 않아야 합니다.");
assertFalse(scanner.hasNext(), "모든 입력이 처리되었어야 합니다.");
}
}
현재 테스트만 통과하게 코드를 빨리 짰는데 추후에 수정 예정입니다.