TIL13. 키오스크 도전과제2

2025. 3. 14. 13:16·TIL

 

 

 

TIL11. 키오스크 Lv2,3 진행

Lv2. 객체 지향 설계를 적용해 햄버거 메뉴를 클래스로 관리어려웠던 점 - 배열 출력  실수한 코드 & 오류 menuItems= new ArrayList(); menuItems.add(new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토

fhtepgocprkswjfgka.tistory.com

 

 

TIL12. 키오스크 Lv4~5 진행

Lv4. 객체 지향 설계를 적용해 음식 메뉴와 주문 내역을 클래스 기반으로 관리하기1. Menu 클래스 생성List은 Kiosk가 관리하기 별로니 Menu 클래스가 관리Menu 클래스에서 카테코리를 만들고 카테고리

fhtepgocprkswjfgka.tistory.com

 

Enum, 람다 & 스트림을 활용한 장바구니 및 주문 관리

  • Enum을 활용하여 사용자 유형별 할인 적용
  • 스트림을 활용한 장바구니 조회 및 삭제 기능 추가
  • 기존 메뉴 선택 및 주문 흐름 유지

1. 사용자 유형(Enum)정의 및 할인율 적용

public enum UserType {
    NATIONAL_PERSON(0.10), // 국가유공자 10% 할인
    SOLDIER(0.05), // 군인 5% 할인
    STUDENT(0.03),  // 학생 3% 할인
    GENERAL(0.00);  // 일반 0% 할인

    private final double discountRate;
    UserType(double discountRate) {
        this.discountRate = discountRate;
    }
    public double getDiscountRate() {
        return discountRate;
    }
}

 

 

2. 람다&스트림을 활용한 장바구니 조회 기능

  • 메뉴 조회
  • 장바구니 조회 및 삭제
  • 총 계산 금액

(1) 장바구니 출력(반복문 -> 스트림 적용)

기존 방식(반복문)

  • for 반목문으로 cart(장바구니 리스트)안의 모든 MenuItem 객체를 하나씩 가져와서 더함
// 장바구니 내역 보여줌
double totalPrice = 0;
for (MenuItem item : cart) {
    totalPrice += item.getPrice();
}

 

스트림 적용한 방식

 

  • cart는 List<MenuItem> cart 로 객체이다
    객체를 stream 형식으로 입력받을려면 `객체. stream()`
  • `.mapToDouble(MenuItem::getPrice)` > MenuItem에서 getPrice만 추출 
double totalPrice = cart.stream()
                        .mapToDouble(MenuItem::getPrice) // MenuItem에서 가격(price)만 추출
                        .sum();

 

(2) 메뉴 조회(반복문 -> 스트림 적용)

기존 방식(반복문)

//메뉴 아이템 가져오기 for문
for(int i=0; i< items.size(); i++){
     System.out.println((i+1) + ". "+ items.get(i));
}

 

스트림 적용한 방식

IntStream.range(0,categories.size())
		.forEach(i -> System.out.println((i+1) + ". " + items.get(i)));

 

  • IntStream.range(start, end) 는 start부터 end-1 까지의 정수 스트림을 생성하고
  • 0 ~ categories.size() 가 5 라면 1~4의 정수 스트림을 만든다
  • forEach(i -> { } ) 
  • forEach는 스트림에서 생성한 각 정수를 하나씩 받아서 처리하는 함수로
  • i를 이용해 categories.get(i)로 리스트의 i번째 요소를 가져왔다.

 

 

스트림으로 수정하면서 발생한 문제1

메인메뉴를 선택시 또 다시 메인 메뉴가 나오는 문제

문제 발생

 

[메뉴 아이템 - 카테고리 출력]
IntStream.range(0, categories.size())
                .forEach( i -> System.out.println((i+1) +". " + categories.get(i).toString()));
[카테고리 선택 시 - 메뉴 출력 ]
IntStream.range(0, categories.size())
        .forEach(i -> System.out.println((i+1) + ". " + categories.get(i)));

오류 발생 코드

  • 단순한 코드 에러인 것 같아서 MAIN과 Category 부분 스트림 코드를 다시봤다
  • 똑같이 작성했던 게 문제였던 거라 메뉴 출력을 `categories.get(i)` > `items.get(i)` 로 수정했더니 나온 결과
  • 또 다시 문제 발생

 

문제 원인 추측

  • `IndexOutOfBoundsException: Index 2 out of bounds for length 2`
  • 길이가 2인 리스트에서 입력을 2로 받고 접근하려고 했기 때문에 발생한 문제
IntStream.range(0, categories.size())
         .forEach(i -> System.out.println((i+1) + ". " + categories.get(i)));

오류 발생 코드 (Kiosk.java:83) 를 보면

  • 에러 메시지를 보면 displayCategory 메서드의 83번째 줄에서 발생한 것
  • categories.size()가 3인데, `IntStream.range(0.categories.size())`는 `0,1,2` 이렇게 생성하기 때문이다.

사용자의 입력값(choice) - 1을 해서 index와 매칭하면 되지 않을까?

이것을 스트림으로 어떻게 적용할까 ?

 

 

🚨 접근 방법 

  • 이러니 저러니 수정을 해봤지만 전부 오류가 났다. 어떤게 문제일까? 하고 생각해봤는데
  • MAIN에서 3번 DESSERT CATEGORY를 선택했다고 가정해보자.
  • `categories.size()`는 **카테고리 개수(예: 3개)**인데,  `Dessert Menu`  아이템은 2개(Bread, Sandwich)뿐이다.

✅  하나 해결!!!

// [스트림]으로 메뉴아이템
IntStream.range(0, items.size())
        .forEach(i -> System.out.println((i+1) + ". " + items.get(i)));

 

마치며

사실 객체지향의 흐름을 다시 이해하고 싶어서 필수 기능을 2번 만들어봤다. Lv1 ~ Lv5까지 천천히 하라는대로 해보니까 이해하는데에 도움이 많이 됐다.

도전 과제는 할까 말까 고민을 많이 했는데 그래도 도전할 수 있는 데까지는 해보고 싶어서 일단 할 수 있는 데까진 해보았다. 

이런 객체지향의 흐름을 이해할 수 있는 프로그램을 하나정도 더 만들어보고 싶다.

'TIL' 카테고리의 다른 글

📅 일정 관리 애플리케이션(도전과제3)  (0) 2025.03.25
📅 일정 관리 애플리케이션(필수과제)  (0) 2025.03.23
TIL12. 키오스크 Lv4~5 진행  (0) 2025.03.13
TIL11. 키오스크 Lv2,3 진행  (1) 2025.03.12
TIL10. 자바 기초를 공부하면서(2)  (0) 2025.02.28
'TIL' 카테고리의 다른 글
  • 📅 일정 관리 애플리케이션(도전과제3)
  • 📅 일정 관리 애플리케이션(필수과제)
  • TIL12. 키오스크 Lv4~5 진행
  • TIL11. 키오스크 Lv2,3 진행
에그마요샌드위츼
에그마요샌드위츼
  • 에그마요샌드위츼
    아자아자
    에그마요샌드위츼
  • 전체
    오늘
    어제
    • 분류 전체보기
      • java
      • sql
      • TIL
      • spring
      • JPA
      • spring-security
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    til
    GIT
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
에그마요샌드위츼
TIL13. 키오스크 도전과제2
상단으로

티스토리툴바