2025. 1. 15. 22:53ㆍ개발 회고/TIL
😊오늘 배운 내용
키오스크 과제 level 5 까지 구현, 싱글쓰레드, 멀티쓰레드, 우선순위, 데몬쓰레드, 쓰레드 상태, 쓰레드 그룹
[어떤 문제가 있었는지 + 어떻게 해결하였는지]
1. level3 -> level4
레벨 3 요구사항을 구현하고 level 4 요구사항을 구현하는데 처음에는 Menu 클래스를 만들어서 메뉴 카테고리들을 관리하고 MenuItem 클래스에서 각 메뉴들을 관리하는 구조가 이해가 가지 않았다.

그래서 직접 종이에 적어보면서 각 클래스들이 어떠한 관계를 가지고 있는지 정리해보았다. 그랬더니 훨씬 이해도 가기 쉬웠고 각 클래스가 관리하는 필드에 무엇이 들어가있는지 파악할 수 있었다.
따라서 이제 level5 까지 구현이 완료 되어서 다음과 같은 로직을 가지는 프로그램이 동작할 수 있게 되었다!
메뉴 카테고리 출력 -> 메뉴 카테고리 선택 -> 선택된 카테고리의 메뉴들 출력 -> 메뉴 선택 -> 메뉴선택을 반복하다가 0 입력시 뒤로가기 -> 다시 메뉴 카테고리 출력(0 입력시 종료)
다만 지금 한가지 아쉬운 점은 요구사항에 Menu 클래스에서 리스트에 들어있는 MenuItem 객체들을 조회할 수 있는 함수를 구현하라 했었는데 구현했지만 정작 Kiosk 클래스에서 사용하지 않고 있는 상황이다.
package org.example.level4;
import java.util.ArrayList;
import java.util.List;
public class Menu {
//필드
//MenuItem 클래스를 리스트로 관리
private List<MenuItem> menuItems = new ArrayList<>();
private String category;
//생성자
public Menu(String category, List<MenuItem> menuItems) {
this.category = category;
this.menuItems = menuItems;
}
//메서드
//리스트에 들어있는 MenuItem을 순차적으로 보여주는 함수
public void showMenuItem() {
for (MenuItem a : menuItems) {
System.out.println(a.toString());
}
}
//메뉴리스트를 리턴하는 함수
public List<MenuItem> getMenuItems() {
return menuItems;
}
//카테고리를 리턴하는 함수
public String getCategory() {
return category;
}
}
package org.example.level4;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Kiosk {
//필드
private List<Menu> menu = new ArrayList<>();
//생성자
public Kiosk(Menu ... menus) {
for (Menu a : menus) {
menu.add(a);
}
}
//메서드
public void start() {
Scanner sc = new Scanner(System.in);
while (true) {
showCategory();
int categoryChoice = sc.nextInt();
if (categoryChoice == 0) {
break;
}
//상세 메뉴 출력
while (true) {
int menuChoice;
if (categoryChoice == 1) {
System.out.println("[BURGERS MENU]");
for (int i = 1; i < menu.get(0).getMenuItems().size(); i++) {
System.out.print(i + ". ");
System.out.printf("%-14s |",menu.get(0).getMenuItems().get(i).getName());
System.out.printf(" W %-3s | ",menu.get(0).getMenuItems().get(i).getPrice());
System.out.print(menu.get(0).getMenuItems().get(i).getDescription()+"\n");
}
System.out.println("0. 뒤로가기");
while(true) {
System.out.println("메뉴를 선택하세요: ");
menuChoice = sc.nextInt();
if (menuChoice == 0) {
break;
} else {
showSelectedMenu(1,menuChoice);
}
}
break;
} else if (categoryChoice == 2) {
System.out.println("[BEVERAGES MENU]");
for (int i = 1; i < menu.get(1).getMenuItems().size(); i++) {
;
System.out.print(i + ". ");
System.out.printf("%-14s |",menu.get(1).getMenuItems().get(i).getName());
System.out.printf(" W %-3s | ",menu.get(1).getMenuItems().get(i).getPrice());
System.out.print(menu.get(1).getMenuItems().get(i).getDescription()+"\n");
}
System.out.println("0. 뒤로가기");
while(true) {
System.out.println("메뉴를 선택하세요: ");
menuChoice = sc.nextInt();
if (menuChoice == 0) {
break;
} else {
showSelectedMenu(2,menuChoice);
}
}
break;
} else if (categoryChoice == 3) {
System.out.println("[DESSERTS MENU]");
for (int i = 1; i < menu.get(2).getMenuItems().size(); i++) {
System.out.print(i + ". ");
System.out.printf("%-14s |",menu.get(2).getMenuItems().get(i).getName());
System.out.printf(" W %-3s | ",menu.get(2).getMenuItems().get(i).getPrice());
System.out.print(menu.get(2).getMenuItems().get(i).getDescription()+"\n");
}
System.out.println("0. 뒤로가기");
while (true) {
System.out.println("메뉴를 선택하세요: ");
menuChoice = sc.nextInt();
if (menuChoice == 0) {
break;
} else {
showSelectedMenu(3,menuChoice);
}
}
break;
}
}
}
}
public void showCategory() {
System.out.println("[MENU CATEGORY]");
//for문 돌면서 카테고리 출력
for (int i = 1; i <= menu.size(); i++) {
System.out.println(i + ". " + menu.get(i-1).getCategory());
}
System.out.println("0. 종료 | 종료");
System.out.println("메뉴 카테고리를 선택하세요 : ");
}
public void showSelectedMenu(int categoryChoice, int menuChoice) {
System.out.print("선택된 메뉴 : ");
System.out.printf("%-14s |",menu.get(categoryChoice-1).getMenuItems().get(menuChoice).getName());
System.out.printf(" W %-3s | ",menu.get(categoryChoice-1).getMenuItems().get(menuChoice).getPrice());
System.out.print(menu.get(categoryChoice-1).getMenuItems().get(menuChoice).getDescription()+"\n");
System.out.println("");
}
}
그래서 각 카테고리의 메뉴들을 출력할 때 상당히 코드 중복이 많이 되는 상황이다. 이걸 showMenuItem 함수에서 관리할 수 있도록 해서 코드중복을 줄일 예정이다.
[오늘 회고]
오늘은 한동안 밖에 나가질 못해서 정말 정신이 나가버릴 것 같았다. 그래서 외출 2시간 해서 마트에 다녀왔다...^^ 그런데 외출 2시간 해서 2시간 더 늦게 끝나니 집중도 안되고 고역인것 같다... 오늘도 정신줄 간신히 붙들고 키오스크 과제만 겨우 해낸 것 같다.
그래도 학교다닐 때는 나는 AI없으면 코드 한 줄 못짜는 바보같았는데 이제 점점 AI없이 나 혼자 뚝딱뚝딱 만드는 중이다. (그래도 이건 너무 기본적인 내용이라^^... 이 정돈 혼자하는 연습이 반드시 필요하다)
이번주 나의 목표는 키오스크 도전과제까지 완료하는 것이다. 도전과제 1은 장바구니 기능이라 5주차 강의를 안듣고 할 수 있을 것 같지만 2는 아마 강의를 들어야 할 수 있을 것 같다.
내일은 꼭 5주차 강의를 다 듣고 도전과제 1까지 구현하는게 목표다.
성장하는 과정은 과녁에 영점 조정하는 것과 같아서 오늘 실패하더라도 10점에 가깝게 목표를 다시 조정하면서 다시 해나가면 된다! 내일도 힘내보자
'개발 회고 > TIL' 카테고리의 다른 글
| [1/17] TIL - 키오스크 프로젝트에 Enum, Stream, IntStream 적용해보기 (5) | 2025.01.17 |
|---|---|
| [1/16] TIL - 키오스크 프로그램 구현 + 장바구니 기능, static은 왜 쓰면 안될까, 다른 달팽이들은 신경쓰지 말자 (1) | 2025.01.16 |
| [1/14] TIL - 🌟 객체지향 연습하기 - 클래스, 상속, 가변인자 (3) | 2025.01.14 |
| [1/13] TIL - 콘솔 출력 형식 지정, 계산기 코드 개선, 앞으로의 공부 다짐 😊 (4) | 2025.01.13 |
| [1/7] TIL - 다형성, 상속, 추상클래스, 인터페이스, 형변환의 필요성 정리 (2) | 2025.01.07 |