TIL - 키오스크 2단계, 3단계

Jiyeong Kim·2025년 1월 14일

TIL

목록 보기
9/24

Lv2.

리스트 추가형식

        List<String> fruits = new ArrayList<>();

        // 리스트에 요소 추가
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Cranberry");

따라서 과제도 다음 형식에 따라 작성해줌

List<MenuItem> menuItems = new ArrayList<>();
        // List 선언 및 초기화
        // add 함수를 통해 new MenuItem(이름, 가격, 설명) List에 삽입
        menuItems.add(new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
        menuItems.add(new MenuItem("SmokeShack", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
        menuItems.add(new MenuItem("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
        menuItems.add(new MenuItem("Hamburger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거"));

출력 부분

오류 : .length에서 오류가 뜬다.

 while (keepRunning) {
            System.out.println("번호를 입력하여 주문을 해주세요.\n" +
                    "[ SHAKESHACK MENU ]\n");
            for(int i=0; i<menuItems.length; i++) {
                System.out.println((i+1)+". : " + menuItems.get(i));
            }
            System.out.println("0. 종료                   | 종료");

        }

원인 : List에는 Length를 쓸 수 없다.
이유:

  • Array 배열은 기본 자료형처럼 동작하기 때문에 length라는 속성(property)으로 크기를 제공
  • 리스트는 객체: 리스트는 배열처럼 단순한 구조가 아니며, 내부적으로 크기를 동적으로 관리. 따라서 크기를 확인하는 동작을 메서드로 추상화한 것.

사실 이해가 안된다! 일단은 리스트는 size로 크기를 체크할 수 있음만 이해하고 넘어가기로 함

해결 :

while (keepRunning) {
            System.out.println("번호를 입력하여 주문을 해주세요.\n" +
                    "[ SHAKESHACK MENU ]\n");
            for(int i=0; i<menuItems.size(); i++) {
                System.out.println((i+1)+". : " + menuItems.get(i));
            }
            System.out.println("0. 종료                   | 종료");

예외 처리 어떻게 하지..
try catch를 써보려고 했는데 영 삽질 시간이 길어져서 포기했다. 간단하게 if 문으로 해결했는데, 5단계를 끝내고 하면 되지 않을까 싶다.

try {
                input = Integer.parseInt();  //정상적일경우 num에 데이터 입력
            } catch (IOException | NumberFormatException e) {    //에러 발생일 경우
                System.out.println("[System] 잘못된 입력입니다. 다시 입력하세요.");
                return inputInteger();     //재귀함수(자기자신 다시 실행)
            }

if 문

if (input == 0 ) {
                System.out.println("키오스크를 종료합니다.");
                break;
            } else if (input <= menuItems.size()) {
                System.out.println("선택한 메뉴 : "+ menuItems.get(input - 1));
                break;
            }  else {
                System.out.println("다시 입력해주세요.");
                continue;// 숫자 이외의 입력을 받았을 때 나오는 문구
            }
        }
       // 프로그램을 종료
        // 선택한 메뉴 : 이름, 가격, 설명
        scanner.close();
    }

또 다른 문제..

실행했을 때.메뉴가.. 주소로 뜬다

Object 상속문제
Object에 정의된 toString()메소드가 주소값을 리턴해주고 있는 것이다.

추후에 참고할 블로그 : toString 상세설명

확인:

shift*2

class 탭에서 Object of java.lang 검색

해당 클래스에 들어가 보면 다음과 같은 toString 메소드가 있는 것을 볼 수 있다.

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

해결
메인 클래스에서 toString 메소드를 재정의 해준다.

@Override
    public String toString() { 
        return name + " | 가격: " + price + " | 설명: " + description;
    }

이렇게 2단계는 무사히 끝이 났다..

Lv 3. 객체 지향 설계를 적용해 순서 제어를 클래스로 관리하기

  • 요구사항이 가지는 의도
    • 객체 지향 개념을 학습하고, 데이터를 구조적으로 관리하며 프로그램을 설계하는 방법을 익힙니다.
    • main 함수에서 관리하던 전체 순서 제어를 Kiosk 클래스를 통해 관리합니다.

Kiosk 클래스 생성하기

  • 설명: 키오스크 프로그램의 메뉴를 관리하고 사용자 입력을 처리하는 클래스입니다.
    • MenuItem을 관리하는 리스트가 필드로 존재합니다.
    • main 함수에서 관리하던 입력과 반복문 로직은 이제 start 함수를 만들어 관리합니다.
    • List<MenuItem> menuItemsKiosk 클래스 생성자를 통해 값을 할당합니다.
      • Kiosk 객체를 생성하고 사용하는 main 함수에서 객체를 생성할 때 값을 넘겨줍니다.

1. Kiosk 클래스 생성하기

자바에서 파라미터란? 메소드를 선언할 때 사용되는 변수
그냥 까먹어서 적음 언젠가 벨로그에서 검색해보겠지..

시작하자마자 틀림. 작성하다 존 게 틀림없음. 큰일났음

public class Kiosk {
    private List<MenuItem> menuItems = new ArrayList<>();
}

Q. ? 이게 뭐예요
A. ...그냥 붙여넣기 하고 넘어갔다고 합니다.

public class Kiosk {
     private List menuItems;
     public Kiosk (List<MenuItem> menuItems) {
        this.menuItems = menuItems;
    }
}

또 브레이스 문제

public void start () {
        Scanner scanner = new Scanner(System.in);
        boolean keepRunning = true;

        while (keepRunning) {
            System.out.println("번호를 입력하여 주문을 해주세요.\n" +
                    "[ SHAKESHACK MENU ]\n");
            for(int i=0; i<menuItems.size(); i++) {
                System.out.println((i+1)+"." + menuItems.get(i)); //오브젝트 상속
            }
            System.out.println("0. 종료 | 종료합니다.");
// 입력된 숫자에 따른 처리 | 정상 숫자 입력 - 출력, 종료, | 잘못된 입력 - 되돌아가기
            System.out.println("번호를 입력하세요: ");
            int input = scanner.nextInt();// 숫자를 입력 받기

            if (input == 0 ) {
                System.out.println("키오스크를 종료합니다.");
                break;
            } else if (input <= menuItems.size()) {
                System.out.println("선택한 메뉴 : "+ menuItems.get(input - 1));
                break;
            }  else {
                System.out.println("다시 입력해주세요.");
                continue;// 숫자 이외의 입력을 받았을 때 나오는 문구
            }
        }

해당 코드를 키오스크 클래스 안에 넣지 않아서 계속해서 오류가 생겼다. 어렸을적에 수학학원에서 선생님이 괄호 제대로 안본다고 정색했던 기억이 난다. 세살버릇 여든까지 간다고..

이러고 실행을 하는데 오류는 없는데 또 출력도 안되는 거다.

당연함. 키오스크 클래스만 손댔음.

Main class :
키오스크에서 입력과 출력, 리스트 관리를 하게 되었음
이제 메인클래스에는 리스트 추가와 키오스크 작동의 역할만 남아있다.

package com.example.kiosk.lv3;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        List<MenuItem> menuItems = new ArrayList<>();

        // List 선언 및 초기화
        // add 함수를 통해 new MenuItem(이름, 가격, 설명) List에 삽입
        menuItems.add(new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
        menuItems.add(new MenuItem("SmokeShack", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
        menuItems.add(new MenuItem("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
        menuItems.add(new MenuItem("Hamburger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거"));
// 반복문을 활용해 List 안에 있는 MenuItem을 하나씩 출력

    }
}

손 대기 전의 메인클래스. 키오스크를 추가해줘야한다.

Kiosk kiosk = new Kiosk(menuItems);
    kiosk.start();

를 추가 해줬다.

요구사항에 부합하는지 검토

  • 키오스크 프로그램을 시작하는 메서드가 구현되어야 합니다.
    • 콘솔에 햄버거 메뉴를 출력합니다.(됨)
    • 사용자의 입력을 받아 메뉴를 선택하거나 프로그램을 종료합니다.(됨)
    • 유효하지 않은 입력에 대해 오류 메시지를 출력합니다.(안됨)
    • 0을 입력하면 프로그램이 ‘뒤로가기’되거나 ‘종료’됩니다.(종료만됨)

문제는 작동은 되는데! 오류메시지 출력과 뒤로가기가 구현이 안되어있음을 이제야 깨달았다.

if (input == 0 ) {
                System.out.println("키오스크를 종료합니다.");
                break;
            } else if (input <= menuItems.size()) {
                System.out.println("선택한 메뉴 : "+ menuItems.get(input - 1));
                break;
            }  else {
                System.out.println("다시 입력해주세요.");
                continue;// 숫자 이외의 입력을 받았을 때 나오는 문구
            }

숫자를 입력했을때는 메시지 출력과 재생이 가능하지만
글자 등을 입력했을때 오류 메세지가 아니라 진짜 오류가 뜨는 문제가 있다.. 이건 시간 상 내일.. 해야한다..

배운 점: 컨디션 관리를 잘하자.. 약기운으로 코딩하는거 정말 괴롭다

profile
해봅시다

0개의 댓글