반응형
목차
Lv 3. 객체 지향 설계를 적용해 순서 제어를 클래스로 관리하기
1. 요구사항
- Kiosk 클래스 생성하기
- 설명: 키오스크 프로그램의 메뉴를 관리하고 사용자 입력을 처리하는 클래스입니다.
- MenuItem을 관리하는 리스트가 필드로 존재합니다.
- main 함수에서 관리하던 입력과 반복문 로직은 이제 start 함수를 만들어 관리합니다.
- List<MenuItem> menuItems 는 Kiosk 클래스 생성자를 통해 값을 할당합니다.
- Kiosk 객체를 생성하고 사용하는 main 함수에서 객체를 생성할 때 값을 넘겨줍니다.
- 키오스크 프로그램을 시작하는 메서드가 구현되어야 합니다.
- 콘솔에 햄버거 메뉴를 출력합니다.
- 사용자의 입력을 받아 메뉴를 선택하거나 프로그램을 종료합니다.
- 유효하지 않은 입력에 대해 오류 메시지를 출력합니다.
- 0을 입력하면 프로그램이 ‘뒤로가기’되거나 ‘종료’됩니다.
2. 트러블 슈팅(문제 해결)
1. 문제 상황
- InputMismatchException 이 일어날 경우, 오류 메시지 출력 후 다시 입력할 수 있도록 진행되어야하는데 그렇게 되지 않았다.
2. 해결 과정
- input.nextLine(); 을 이용해서 버퍼를 비워주었더니 해결되었다.
3. 문제 발생 이유
- 입력 후 Enter를 칠 때 Enter의 값이 남아있는데 그게 자동으로 값이 넘어가는 것이었다.
[해결한 코드]
try {
select = input.nextInt();
} catch(Exception e) {
System.out.println("숫자를 입력해주세요!");
// 버퍼를 비워서 select에 들어간 값을 비워줘야함.
input.nextLine();
continue;
}
3. 전체 코드
더보기
더보기
더보기
Kiosk.java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Kiosk {
// 속성
private final List<MenuItem> menuItems;
// 생성자
public Kiosk(List<MenuItem> menuItems){
this.menuItems = menuItems;
}
// 기능
public void start() {
Scanner input = new Scanner(System.in);
// 선택한 메뉴를 담을 list
List<String> selectList = new ArrayList<>();
// while문 break 용도
boolean check = true;
while (check) {
// 메뉴 출력
System.out.println("[ SKY COFFEE MENU ]");
for (int i = 0; i < menuItems.size(); i++) {
System.out.println(i + 1 + ". " + menuItems.get(i).toString());
}
System.out.print("메뉴를 선택해주세요(종료 시 0 입력): ");
int select = 0;
try {
select = input.nextInt();
} catch(Exception e) {
System.out.println("숫자를 입력해주세요!");
// 버퍼를 비워서 select에 들어간 값을 비워줘야함.
input.nextLine();
continue;
}
switch (select) {
case 1:
System.out.println(1 + ". " + menuItems.get(0).getCoffee() + "을 선택하셨습니다.\n");
selectList.add(menuItems.get(0).getCoffee());
break;
case 2:
System.out.println(2 + ". " + menuItems.get(1).getCoffee() + "을 선택하셨습니다.\n");
selectList.add(menuItems.get(1).getCoffee());
break;
case 3:
System.out.println(3 + ". " + menuItems.get(2).getCoffee() + "을 선택하셨습니다.\n");
selectList.add(menuItems.get(2).getCoffee());
break;
case 4:
System.out.println(4 + ". " + menuItems.get(3).getCoffee() + "을 선택하셨습니다.\n");
selectList.add(menuItems.get(3).getCoffee());
break;
case 5:
System.out.println(5 + ". " + menuItems.get(4).getCoffee() + "을 선택하셨습니다.\n");
selectList.add(menuItems.get(4).getCoffee());
break;
case 0:
System.out.println("프로그램을 종료합니다.");
// 선택된 음료가 있을 경우에만 출력
if(!selectList.isEmpty()){
System.out.println("선택하신 메뉴는 ");
// 개선할 필요가 있는 코드.
for (String s : selectList) {
for (MenuItem menuItem : menuItems) {
if (menuItem.getCoffee().equals(s)) {
System.out.println(menuItem);
}
}
}
System.out.println("입니다.");
}else{
System.out.println("선택하신 음료가 없습니다.");
}
// 강제 종료하는 느낌이 강함. break 추천.
check = false;
break;
default:
System.out.println("잘못된 번호를 입력하셨습니다!");
}
}
}
}
MenuItem.java
public class MenuItem {
// 불변객체 설정
private final String coffee;
private final int price;
private final String info;
// 생성자
public MenuItem(String coffee, int price, String info){
this.coffee = coffee;
this.price = price;
this.info = info;
}
// 재정의 없이 toString()을 사용하면 값이 출력되는 게 아니라 메모리 주소가 나오게 됨.
// 오버라이딩을 이용해 toString() 메서드를 재정의해서 해결할 수 있음.
// 참고 블로그 : https://velog.io/@wnajsldkf/toString-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%98%AC%EB%B0%94%EB%A5%B4%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
@Override
public String toString() {
return coffee + " | W " + price + " | " + info;
}
//불필요한 getter, setter 삭제
public String getCoffee() {
return coffee;
}
}
Main.java
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<MenuItem> menuItems = new ArrayList<>();
menuItems.add(new MenuItem("Espresso", 2500, "고온ㆍ고압하에서 곱게 간 커피 가루에 물을 가해, 30초 이내에 내린 커피."));
menuItems.add(new MenuItem("Americano", 3000, "에스프레소에 물을 넣어 연하게 마시는 커피."));
menuItems.add(new MenuItem("Caffé Latte", 3500, "에스프레소에 따뜻한 우유를 1:2 또는 1:3 정도의 비율로 섞은 커피."));
menuItems.add(new MenuItem("Caramel Macchiato", 4000, "에스프레소에 캐러멜 소스와 우유를 넣고 우유 거품만 살짝 올린 커피."));
menuItems.add(new MenuItem("Café Mocha", 4500, "에스프레소에 우유와 초콜릿을 넣고 휘핑크림을 올린 커피."));
Kiosk kiosk = new Kiosk(menuItems);
kiosk.start();
}
}
3. 기존의 코드에서 수정한 부분
반응형
'스파르타 내일배움캠프 > TIL(Today I learned)' 카테고리의 다른 글
25.03.17 TIL - 람다식 (2) | 2025.03.17 |
---|---|
25.03.14 TIL - 키오스크 과제 회고 (3) | 2025.03.14 |
25.03.12 TIL - 컬렉션 (2) | 2025.03.12 |
25.03.11 TIL - Optional, 키오스크 과제 (2) | 2025.03.11 |
25.03.10 TIL - 예외처리 (2) | 2025.03.10 |