TIL&WIL

2023-06-02 TIL (Java 키오스크 만들기, 프로그래머스 문풀)

blues_jun 2023. 6. 2. 21:15

오늘은 어제 하지 못했던 키오스크 만들기 개인과제 추가 옵션 기능들을 구현하였다.

 

구현한 내용들은 다음과 같다.

  • 주문개수 기능 추가
  • 상품 옵션 기능추가
  • 총 판매금액 조회 기능 추가
  • 총 판매상품 목록 조회 기능 추가

링크

https://github.com/hakjunjoo/kiosk/tree/master/kiosk

 

GitHub - hakjunjoo/kiosk: java kiosk program

java kiosk program. Contribute to hakjunjoo/kiosk development by creating an account on GitHub.

github.com


주문개수 기능 추가

주문개수 기능은 새로운 List를 추가해서 해당 메뉴가 기존 List에 있으면 그 메뉴는 추가하지 않고, 메뉴의 개수만 추가하는 로직을 구성했다.

private static ArrayList<Product> wish = new ArrayList<Product>(); // default list
private static ArrayList<Product> cntWish = new ArrayList<>(); // count list
private static ArrayList<Product> totalWish = new ArrayList<Product>(); // total list
  • 첫번째 wish는 메뉴를 담고, 비교해주는 list이다.
  • 두번째 cntWish는 메뉴를 담을때, 비교하고 비교 결과에 따라서 개수를 추가하는 list이다.
  • 세번째 totalWish는 마지막 추가 구현 기능인 총 판매금액과 총 판매상품 목록을 위한 list이다.

 

비교 하는 로직은 다음과 같다.

//기존 장바구니에 상품이 있는 경우
for(int i=0; i<Order.getCntWish().size(); i++) {
    if (Order.getCntWish().get(i).toString().equals(Kiosk.products[n-1][m-1].toString())) {
        exists = true;
        Product existingProduct = Order.getCntWish().get(i);
        existingProduct.setCount(existingProduct.getCount() + 1); // 상품의 카운트 +1
        System.out.println("\n================================================\n");
        System.out.println(existingProduct.getName() + "가 장바구니에 추가되었습니다.");
    }
}
//기존 장바구니에 상품이 없는 경우
if(!exists) {
    Order.getCntWish().add(products[n-1][m-1]);
    System.out.println("\n================================================\n");
    System.out.println(products[n-1][m-1].getName() + " 가 장바구니에 추가되었습니다.");
}

상품 옵션 기능 추가

상품 옵션은 Burger메뉴를 선택했을 때 사이즈업을 물어보는 옵션을 추가했다.

if (n == 1){ //burgers 추가옵션
	Kiosk.addOptions(n, m);
	int e = sc.nextInt();
	if (e == 1) { // 사이즈 업을 선택하면
		Kiosk.sizeUp(n, m); //메뉴이름이 Burgers(사이즈업)으로 바뀌고, 가격이 3.0 비싸진다.
		Kiosk.wishList(n, m);
	} else {
		Kiosk.wishList(n, m);
	}
}

여기서 sizeUp 메소드가 호출되면 선택된 메뉴이름이 'burgers(사이즈업)'으로 바뀌고, 가격이 W 3.0 비싸진다.

sizeUp메소드는 다음과 같다.

public static void sizeUp(int n, int m) {
	products[n-1][m-1].setName(products[n-1][m-1].getName()+"(사이즈업)"); // 메뉴이름 Burgers(사이즈업)
	products[n-1][m-1].setPrice(products[n-1][m-1].getPrice()+3.0); // 메뉴 가격 +3.0
}

getter setter를 이용하여 이름을 바꾸어 주었다.

 


총 판매금액과 총 판매 상품목록 조회

총 판매금액과 총 판매 상품목록 조회는 위의 totalWish를 사용하여 나타냈다.

wish를 초기화하기 전에 wish에 있는 요소들을 전부 totalWish에 넣어주고, totalWish는 초기화하지 않는 것이다.

Order.getTotalWish().addAll(Order.getWish()); // 초기화 전 전부 원소를 전부 옮긴다.

그리고 메인 메뉴판 화면에서 0번을 누르면 목록이 조회될 수 있도록 구현하였다.

case 0 -> {
	double salePrice = 0.0;
	for (int j = 0; j < Order.getTotalWish().size(); j++) {  // 총 판매금액 합치기
		salePrice += Order.getTotalWish().get(j).getPrice();
	}
	System.out.println("\n================================================\n");
	System.out.println("[ 총 판매상품 목록 현황 ]");
	for (Product totalPro : Order.getTotalWish()) {
		System.out.println("- " + totalPro.getName() + "| " + totalPro.getPrice());
	}
	System.out.println("\n[ 총 판매금액 현황 ]");
	System.out.println("현재까지 총 판매된 금액은 [ W " + (Math.round(salePrice * 10.0) / 10.0) + " ] 입니다.");
	System.out.println("\n1. 돌아가기");
	System.out.print("\n여기에 번호를 입력하세요 => ");
}

알게된 점과 느낀 점

  • static은(클래스 맴버) 최대한 상수 역할을 하는 상황에서만 사용하는 것이 좋다.
  • 데이터를 초기화 하는 부분을 List로 구현했으면 데이터가 바뀌어도 로직을 수정하는데 큰 어려움이 없다.
  • getter & setter는 활용하면 정말 좋으니 구현하는 방법과 동작 원리는 얼른 익숙해지는 것이 좋다.
  • 메소드의 길이는 10줄을 넘지 않는 것이 좋다.
  • 메소드안에서 메소드를 호출하면 유기적으로 연결될 수 있으니까 더욱 가독성이 좋아진다.

느낀 점은 우선 위의 코드가 좋은 코드인지 좋지 않은 코드인지를 떠나서 뿌듯했다. 처음 개인과제를 받았을 때는 내가 어떻게 이걸 구현을 하라는거지라는 생각이 있었는데, 일주일동안 계속 해보니 어떻게든 구현이 되었다.

 

많은 시행착오가 있었고, 이런 과정들이 나를 더욱 성장하게 만드는 것들이라 생각하기에 더욱 많은 시행착오를 겪어야 겠다고 생각했다.