전반적으로 과제를 진행할 때 자바의 “객체지향” 적인 내용을 이해하기 위해 바로 가독성 좋은 코드를 짜지 않고 단계별로 코드를 작성했다. 과제 가이드에 있는 주석에서 안내한 대로 코드를 작성하려고 노력했다. 최대한 내 나름대로 커스텀하지 않고, 바보같이 코딩하려고 했고 임의로 예외처리도 진행하지 않았다. 하나하나 가이드 라인대로 코드를 작성하다보니, 자바의 객체지향적인 면을 더 자세히 깨닫게 되어서 기본기가 탄탄해지는 시간이 된 것 같아 뿌듯했다 !
Lv 2.
[ Burgers MENU ]
1. ShackBurger | W 6.9 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거
2. SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거
3. Cheeseburger | W 6.9 | 포테이토 번과 비프패티, 치즈가 토핑된 치즈버거
4. Hamburger | W 5.4 | 비프패티를 기반으로 야채가 들어간 기본버거
0. 뒤로가기
다음과 같이 예쁜 형식으로 정렬되게 출력하기 위해서는 단순히 Getter를 사용해서 메뉴이름, 가격, 설명을 추출해내서는 안된다. 따라서 다음과 같이 형식을 맞춰서 출력하기 위해서는 형식 지정자를 사용해야한다.
System.out.printf("%d. %-15s | W %-4.1f | %s%n",
i + 1, item.getMenuName(), item.getPrice(), item.getDescription());
- 메뉴 번호 :
%d.
→ 정수 출력 - 메뉴 이름 :
%-15s
→ 15칸을 확보한 후 왼쪽 정렬하여 문자열을 출력 - 가격 :
| W %-4.1f |
총 4자리 공간을 확보, 왼쪽 정렬, 소수점 이하 1자리까지 출력 - 설명 :
"%s%n"
→ 문자열 출력 후 줄 바꿈
Lv 3.
Lv3 를 구현하면서 마주한 문제들을 정리하고자 한다.
🤯 static 선언은 어디에 해야할까 ?
kiosk 를 구현할 때 static
키워드를 너무 남발했다.
private static List<MenuItem> menuItems; // MenuItem 리스트
// 키오스크 내에 메뉴를 추가할 생성자
Kiosk(List<MenuItem> menuItems) {
this.menuItems = menuItems;
this.scanner = scanner;
}
public static void start() {
// 입력과 반복문 로직
}
여기서 menuItems
는 모든 Kiosk
인스턴스가 공유하는 변수가 아니므로 인스턴스 변수로 변경해야한다. 게다가 생성자에서 받은 menuItems
는 객체 단위 변수이므로 start()
도 인스턴스 메서드로 변경해야 한다.

출력이 잘 되는 것을 확인할 수 있다.
Lv 4~5
Menu 클래스를 구현함에 있어서 오해를 해서 시간이 좀 오래 걸렸다.
public class Menu {
// 카테고리 이름 필드 추가
// MenuItem 클래스를 List로 관리
// List에 포함된 MenuItem을 순차적으로 보여주는 함수
// List를 리턴하는 함수
// 구조에 맞게 함수를 선언해놓고 가져다 사용하세요.
}
// 카테고리 이름 필드 추가
이 주석을 *private* String categoryName;
← 이것과 같은 말로 해석하지 않고, Burgers
, Drinks
, Desserts
각각의 이름 필드를 추가하는 건 줄 알고 꽤 오랜 시간 삽질을 했다 ,,,, 메뉴가 바로 각각의 메뉴 카테고리를 품고 있다고 생각했던 것이다. 하지만 메뉴 안에 모든 카테고리를 품고 있게 된다면 각각의 상세메뉴 (menuItem) 과의 관계도 틀어지므로 이를 어떻게 풀어나가야하나 싶어서 막막했다 ……
하지만 하루정도 지나고 나니, 요구사항을 오해했던 것을 알게 되었다. 따라서 그 이후에는 주석에 맞춰서 차례로 개발을 할 수 있었다. 전부 구현하고나니 차근차근 단계별로 객체지향을 향해 나아간다는 느낌을 받을 수 있었다.
Level 3과 Level4의 가장 큰 차이점
// 메뉴 아이템 리스트 생성 및 초기화
List<MenuItem> menuItems = new ArrayList<>();
// Item> menuItems는 Kiosk 생성자를 통해 값을 할당 (메뉴 추가)
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, "비프패티를 기반으로 야채가 들어간 기본버거"));
// Kiosk 객체 생성
Kiosk kiosk = new Kiosk(menuItems);
Level 3의 경우 메뉴 아이템 리스트를 바로 만들어서 키오스크에 넣어준다. 이후 메뉴들을 차례로 출력한다.
// Menu 객체 생성하면서 카테고리 이름 설정
Menu burgerMenu = new Menu("Burgers");
Menu drinkMenu = new Menu("Drinks");
Menu dessertMenu = new Menu("Desserts");
// Menu 클래스 내 있는 List<MenuItem> 에 MenuItem 객체 생성하면서 삽입
// 버거 메뉴 생성
burgerMenu.addMenuItem(new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
burgerMenu.addMenuItem(new MenuItem("SmokeShack", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
burgerMenu.addMenuItem(new MenuItem("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
burgerMenu.addMenuItem(new MenuItem("Hamburger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거"));
// 음료 메뉴 생성
drinkMenu.addMenuItem(new MenuItem("Coca Cola", 2.5, "시원한 코카콜라"));
drinkMenu.addMenuItem(new MenuItem("Sprite", 2.5, "청량한 스프라이트"));
// 디저트 메뉴 생성
dessertMenu.addMenuItem(new MenuItem("Chocolate Cake", 4.5, "달콤한 초콜릿 케이크"));
dessertMenu.addMenuItem(new MenuItem("Bubble tea", 5.5, "쫀득한 버블티"));
// Kiosk에 메뉴 추가
List<Menu> menus = new ArrayList<>();
menus.add(burgerMenu);
menus.add(drinkMenu);
menus.add(dessertMenu);
그러나 Level 4는 메뉴 속에 카테고리 별로 담고 각 카테고리 안에 상세 메뉴를 담는 모습을 볼 수 있다. 이를 통해 각각의 메뉴선택 - 선택된 상세메뉴 를 확인할 수 있게 되었다.

끝으로
요구사항 분석이 중요하다는 것을 알았다. 구현에 급급해서 뿌리부터 잘못이었던 것을 너무 늦게 알아차린 적이 한두 번이 아니었는데 또 같은 실수를 해버렸다 ㅠㅠ …. 내 생각엔 개발을 하면서 “ 왜 “ 에 집중하지 않고 그냥 와다다다 코드를 작성하는 습관 때문인 것 같다. 마지막 즈음 뭔가 이상한데 …. ? 싶어서 다시 차근차근 읽어보니까 금방 해결했다 !!! 잘하고 싶은 마음에 너무 급하게 구현하느라 그랬던 것 같다.