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 |