TIL 17 [ 키오스크 과제 (도전🔥 1단계) + Intellij 깃 사용법 ]

2025. 3. 12. 21:55·[내일배움캠프-Sparta]/Spring 6기
반응형

1. 학습내용 : 키오스크 과제 도전1단계, 알고리즘 Daily 풀기

★ 키오스크 도전 1단계 ★

(Challenge) Lv 1. 장바구니 및 구매하기 기능 추가하기

Main,Menu,MenuItem 클래스는 하나의 수정도 없이 동일하며, 직접적으로 Setter 함수를 사용하지 않기 때문에 삭제해서 코드량을 줄였다.

도전 1단계 에서는 Cart 클래스를 생성해서 장바구니 기능 역할을 추가 하였다.

package com.example.kiosk;

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

public class Kiosk {
    // 속성 필드 캡슐화 적용
    private final List<Menu> menus;
    // 생성자
    public Kiosk() {
        menus = new ArrayList<>();
    }
    // 기능
    // 메뉴 카테고리에 추가
    public void addMenu(Menu menu) {
        menus.add(menu);
    }
    // 작동 시작.
    void start() {
        Scanner sc = new Scanner(System.in);
        Cart cart = new Cart(); // 장바구니 객체 생성
        while(true) {
            System.out.println("[ Main MENU ]");
            for (int i = 0; i < menus.size(); i++) {
                System.out.println((i + 1) + ". " + menus.get(i).getCategory());
            }
            System.out.println("0. 종료      | 종료\n");

            if (!cart.getMenuItems().isEmpty()) { // 장바구니에 카트가 비어있으면, 해당 값 출력 X
                System.out.println("[ Order MENU ]"); // 4,5로 지정안한 이유 물품추가될 가능성 고려해 음수로 값입력 받게함.
                System.out.println("-1. Orders      | 장바구니를 확인 후 주문합니다.");
                System.out.println("-2. Cancel      | 진행중인 주문을 취소합니다.\n");
            }
            System.out.print("카테고리를 선택하세요(종료 0): ");

            try {
                int choose = sc.nextInt();
                if (choose == 0) {
                    System.out.println("\n키오스크를 종료합니다.\n");
                    break; // 반복문 종료
                } else if (choose >= 1 && choose <= menus.size()) {
                    menus.get(choose - 1).showSubMenu();
                    int choose2 = sc.nextInt();
                    if (choose2 >= 1 && choose2 <= menus.get(choose - 1).getMenuItems().size()) { // << 해당 부분 gpt 도움받음. BoundsException 오류 발생 유일한 값 3만..
                        // 메소드 체이닝 ( . . . 연결되어서 이어지는 방식 )
                        MenuItem item = menus.get(choose - 1).getMenuItems().get(choose2 - 1);
                        System.out.println("\n 선택한 메뉴: " + item.getName() + " | " +
                                item.getPrice() + "원 | " + item.getExplain() + "를 선택하였습니다.\n");
                        cart.addCart(item); // cart에 선택한 상품 저장.
                    } else if (choose2 == 0) {
                        System.out.println();
                    } else {
                        System.out.println("\n유효하지 않은 메뉴 번호 입니다.\n");
                    }
                } else if (choose == -1) {
                    if (cart.showInfo()) { // 함수로 반환값 찾을때까지 다 읽음.
                        cart.cartReset(); // 주문 완료후 장바구니 초기화
                    }
                } else if (choose == -2) {
                    cart.cartReset();
                } else {
                    System.out.println("\n유효하지 않은 카테고리 번호 입니다. \n");
                }
            } catch (InputMismatchException e) { // 정수로 입력되지 않을시 예외처리
                System.out.println("\n해당 입력값은 유효하지 않습니다.\n");
                sc.nextLine(); // 버퍼 지우기 (안할시, 무한루프 반복됨 → 버퍼를 안지웠기 때문)
            }
        }
    }
}

Kiosk 클래스

package com.example.kiosk;

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

public class Cart {
    // 장바구니 클래스를 담당한다.
    private List<MenuItem> menuItems = new ArrayList<>();
    Scanner sc = new Scanner(System.in);

    // 장바구니 출력 및 금액 계산
    boolean showInfo() {
        System.out.println("아래와 같이 주문 하시겠습니까?");
        System.out.println("[ Orders ]");
        for(int i=0; i<menuItems.size(); i++) {
            MenuItem menuItem = menuItems.get(i); // menuItem 객체 접근
            System.out.println((i+1) + ". " + menuItem.getName() + " | " + menuItem.getPrice() + "원 | " + menuItem.getExplain());
        }

        System.out.println("\n[ Total ]");
        int sum = 0;  // 총합 계산;
        for (MenuItem menuItem : menuItems) {
            sum += menuItem.getPrice();
        }
        System.out.println(sum + "원\n");
        System.out.println("1. 주문       2. 메뉴판");
        int choose = sc.nextInt();
        if (choose == 1 && sum > 0) { // 주문시, 합계금액이 0원을 넘어야 주문가능
            System.out.println("\n주문이 완료 되었습니다. 금액은 " + sum + "원 입니다.\n");
            return true; // 튜터님 도움받아서 void 말고 boolean 으로 반환.
        }
        System.out.println("\n주문한 상품이 없습니다.\n");
        return false;
    }

    // 장바구니 담기
    void addCart(MenuItem menuItem) {
        menuItem.showInfo();
        System.out.println("위 메뉴를 장바구니에 추가하시겠습니까?");
        System.out.println("1. 확인        2. 취소");
        int choose = sc.nextInt();
        if (choose == 1) {
            menuItems.add(menuItem);
            System.out.println("\n" + menuItem.getName() +"이(가) 장바구니에 추가 되었습니다.\n");
        } else if (choose == 2) {
            System.out.println("\n취소 되었습니다.\n");
        } else {
            System.out.println("\n잘못된 입력 값입니다.\n");
        }
    }

    // 장바구니 초기화
    void cartReset() { // 튜터님 도움 받아서 clear 메소드를 알게됨.
        if(!menuItems.isEmpty()) { // 비어있지 않다면 초기화.
            menuItems.clear(); // 배열에 있는 모든 요소들을 전부 초기화 시킴.
            System.out.println("\n진행중이던 주문을 초기화 하였습니다.\n");
        } else {
            System.out.println("\n주문한 상품이 없습니다.\n");
        }
    }

    public List<MenuItem> getMenuItems() {
        return menuItems;
    }
}

Cart 클래스

[트러블 슈팅]

  • 배경 : 코드를 다 완성하고 하나씩 예외를 확인 하는 과정에서, 문자열 입력시 메뉴판이 무한 반복되는 현상 발생
  • 발단 : Scanner 입력값에 문자열을 입력시, 메뉴판 무한 반복된 다는것을 인지
  • 전개 : Scanner 입력값이 int로 받고 있기 때문에 아닌가? 의문이 듬 하지만 try-catch문으로 이용해서 예외처리 하여서 InputMismatchException 을 잡고 있음
  • 위기 : 아니면 버퍼의 문제 인가 싶어서 sc.nextLine()으로 입력 값을 다 읽게함. (엔터값 까지 포함)
  • 절정 : sc.nextLine()으로 catch문에 추가를 하였더니, 더이상 잘못된 문자열을 입력하여도, 버퍼를 초기화 시킴에 따라서 무한루프에 빠지지 않는 현상이 해결
  • 결말 : 결과적으로, 문제는 해결 되었으며 계산기 과제에서도 버퍼를 지우지 않았기 때문에 입력 해야하는 곳이 자동으로 넘어가지는 현상이 발견하면 무조건 버퍼를 지우는 시도를 할 것임

- 새로 알게된 점  ★★★

알고리즘 문제에서 SQL문이 Order by는 Name 사전순으로 조회, DateTime이 나중에 보호받기 시작한 동물순으로 조회 에서 여러 컬럼으로 조건을 지정해서 정렬 할수 있다는 점을 알게됨.

 

Enum 에서 values() 메소드는 배열로 반환 받는다는점. 

Enum 클래스가 User 라면  User.values()[i] i는 반복문에서 인덱스값으로 출력 받아볼수 있음.  

User.values().size() 크기도 알아 볼수 있으며 적극 활용이 가능하다.  

 

try-catch문에서 catch문은 여러개 작성 가능하다.
try문 안에 있을때, throw new Exception()으로 오류가 발생하는 지점을 catch문으로 잡아서 예외처리 할수 있다. ★ ★ ★

 

[Git 특강?] - 인텔리제이에서 Git 사용법 ( 최원빈 튜터님 ) 

혼자 튜터님과 1:1로 인텔리제이 깃 연동 부탁드린다고 튜터님한테 찾아갔었는데, 갑자기 하는 도중에 튜터님 께서 여러 사람들이랑 협업 하는 과정으로 해봐야 한다고 하셔서 사람들을 모으고, 수강생 5~6명에서 듣는 미니강의 가 되었다.

 

인텔리제이 화면 좌하단에 있음.

인텔리제이 왼쪽 좌하단에 git 이 있음.

Fetch all remotes ( 모든 수정사항이 있었던것을 다 가져온다 )

윗 화살표 push 아랫 화살표 pull(Update)

■[히스토리 보는법]■

java 파일에서 우클릭 하고 git -> show history 해서 확인하기

로컬에서 문제 나는거는 지워도됨 ( Github저장소에 이미 동일명 Repository로 저장되어 있음 )

책갈피 표시 (노랑표시) - 그냥 즐겨찾기 같은거 느낌이다. 표시해주는것
checkout - 브랜치 전환이라는 뜻 ( 브랜치 이동 )

■[ Push Rejected 오류 ]■
지금 로컬에 있는 브랜치랑 github에 있는 브랜치랑 버전이 달라서 그렇다.
로컬에서 Update 해서 버전을 맞추고, 푸쉬하면 됨..

[ Pull Request(PR) ]


base : main <- compare : ( 브런치 )  합쳐질 대상을 가리킴.
able to merge 가 나오면 ( 충돌이 일어나지않고, 병합 가능함 )

충돌이 나는 이유?  두명이상의 개발자들이 같은 파일에서 작업을 수행해서 push하면 충돌이 일어남.
개발자가 두 코드중 선택을하거나, 최종적으로 다시 에디터에서 정리해서 합치는 방법도 있음.

PR이 머지로 합쳐지면, 없어지고 closed로 감.

 

 

2. 내일 학습 할 것 : 내일은 오전에 일정이 있기 때문에 오후에 올 예정

키오스크 과제 도전 2단계 (해보는데까지) , 알고리즘, 자바 문법 특강( 객체활용 )

반응형

'[내일배움캠프-Sparta] > Spring 6기' 카테고리의 다른 글

TIL 19 [ Java (스트림) , 미니세션 (클래스,객체) + 키오스크 과제 해설 ]  (0) 2025.03.14
TIL 18 [ 키오스크 과제 (도전🔥 2단계) + Java ( 컬렉션, 스트림 ) ]  (0) 2025.03.13
TIL 16 [ 키오스크 과제 5단계 , Java (Enum, 동일성 vs 동등성) ]  (0) 2025.03.11
TIL 15 [ 키오스크 과제(3~4단계) ]  (0) 2025.03.10
TIL 14 [ 키오스크 과제(1~2단계) ]  (0) 2025.03.07
'[내일배움캠프-Sparta]/Spring 6기' 카테고리의 다른 글
  • TIL 19 [ Java (스트림) , 미니세션 (클래스,객체) + 키오스크 과제 해설 ]
  • TIL 18 [ 키오스크 과제 (도전🔥 2단계) + Java ( 컬렉션, 스트림 ) ]
  • TIL 16 [ 키오스크 과제 5단계 , Java (Enum, 동일성 vs 동등성) ]
  • TIL 15 [ 키오스크 과제(3~4단계) ]
dimenshun
dimenshun
한 소년의 개발 일기
    반응형
  • dimenshun
    Dev Life Notes
    dimenshun
  • 전체
    오늘
    어제
    • 분류 전체보기 (268)
      • CS (23)
        • 자료구조 (0)
        • 알고리즘 (0)
        • 컴퓨터 구조 (8)
        • 네트워크 (6)
        • 운영체제 (3)
        • DB ( + SQLD ) (5)
        • SW공학 (1)
      • 프로그래밍 (3)
        • Java (0)
        • Spring (0)
        • HTML,CSS (3)
        • JavaScript (0)
      • 개발 툴 (7)
        • Git(버전관리) (1)
        • Docker (3)
        • AWS (2)
        • JSP (1)
      • 코딩테스트(Algorithm) (125)
        • 백준 (6)
        • 프로그래머스 (119)
      • [내일배움캠프-Sparta] (110)
        • Spring 6기 (106)
        • KPT 회고 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    spring
    세션
    CPU
    Python
    트랜잭션
    컴퓨터구조
    웹
    내일배움캠프
    메모리
    web
    개발자
    network
    Til
    배포
    OS
    KPT
    It
    코딩테스트
    docker
    db
    AWS
    백엔드
    네트워크
    Java
    cs
    Testcode
    운영체제
    알고리즘
    SQL
    SQLD
  • hELLO· Designed By정상우.v4.10.3
dimenshun
TIL 17 [ 키오스크 과제 (도전🔥 1단계) + Intellij 깃 사용법 ]
상단으로

티스토리툴바