https://github.com/BibliyaSeo/console-kiosk/tree/feat/lv5/src/main/java/org/example/lv5
데이터 추가해야 하는데 어떤 식으로 추가하지?
데이터를 계속 new하고 add하면서 하나씩 Main에 생성하기가 너무 지저분해 보여서 한번에 관리하고 싶었는데 Typescript를 생각해서 배열로 관리하면 좋겠다라고 생각했지만 자바는 하 쉽지 않아. 자바는 Map<String, List<Map<String, Object>>>처럼 구조를 잡고 쓰던가 해야하는데 그럼 더 복잡해 보이고… 다른 방법이 없나 하다가 Arrays.asList와 List.of를 발견했다.
자바에서 List는 인터페이스이기 때문에 new List<>()처럼 직접 만들수가 없어서 List<MenuItem> list = new ArrayList<>(); list.add(new MenuItem()); 이렇게 만들어야 하는데 길고 귀찮으니 그때 생긴게 Arrays.asList라고 한다. 한번에 넣고 객체를 만들어버릴 수 있는 형태!
예시)
List<MenuItem> list = Arrays.asList(
new MenuItem(1, "ShackBurger", 6.9, "..."),
new MenuItem(2, "SmokeShack", 8.9, "...")
);
근데 단점은 크기 변경 불가라고 한다. add와 remove를 못한다는 소리! 근데 과제를 보니까 메뉴에 add랑 remove하는 기능을 추가하라는 건 없는 것 같았다. Arrays.asList() 대신에 List.of()를 쓸 수도 있는데 거의 비슷하지만 두개의 차이점은 List.of는 완전 불변이고 Arrays.asList()는 set은 가능하다는 점…?? null값 허용 여부도 좀 다르긴 한데(List.of(null값 절대 불가)) List.of가 더 가볍고 빠르다고 해서 어차피 더미 데이터로 사용할 거라 값이 변하지 않을 거니까 나는 List.of를 쓰기로 결정했다!!
더미 데이터를 만들 때는 대부분 static을 사용한다고 한다.
선용 튜터님께서 클래스에 바로 .찍지 말고 사용하라고 하셨는데 바로 어겨버리기! 가끔 사용할 수 있다고 하셨었는데 그 경우가 static 메서드를 가지고 있을때였나보다. static을 가지고 있으면 new를 생성하지 않고 바로 호출이 가능해서 나는 MenuData.~ 하고 바로 불러와서 사용했다.
static은 클래스에 속한 변수나 메서드를 말하는데 객체(인스턴스)를 생성하지 않아도 사용할 수 있는 애다. 공통된 기능이나 객체마다 만들 필요 없을 때 사용하는데 주로 유틸리티 함수, 더미 데이터에 사용한다.
향상된 for문 썼었는데 id값 없애고 기본 for문으로 index 받아서
<aside> 📌
lv3에서는 id값을 따로 설정해주고 id값에 따라서 값을 뽑아썼기 때문에 향상된 for문을 간편하게 이용했는데 lv4 조건이 index를 이용해서 값을 추출하라고 해서 평범한 for문으로 index값+1을 해서 번호를 주었고 입력 받은 번호의 -1을 해서 선택된 값을 보여주었다. MenuItem에 있던 id값도 다 없애주었다.
</aside>
에러 처리 (스캐너로 받은 값이 int가 아니라면)-9999 값을 리턴해서 처리를 했다. 조금 아쉬운 점은 처음부터 String으로 받아서 형변환을 해서 사용했었으면 다루기가 좀 더 쉬웠을 것 같은데 이미 다 int로 진행해서 그대로 처리했다.
private int getChoiceMenu(String label) {
System.out.print(label + " 메뉴의 번호를 선택해 주세요: ");
if (scanner.hasNextInt()) {
return scanner.nextInt();
} else {
scanner.nextLine();
return -9999;
}
}
if (choiceMenu == -9999) {
System.out.println("숫자를 입력해 주세요.");
System.out.println();
continue;
}
무한루프의 굴레..
<aside> 📌
위 코드와 같이 if문 안에서 조건을 처리해주고 그대로 넘어가면 무한루프가 되었다. 그래서 0을 종료로 쓸 때는 return, 예외 처리나 뒤로가기를 할 때는 continue를 넣어줬고 hasNextInt()가 false일 때도 그냥 두면 무한루프가 되어서 입력 버퍼를 비워주기 위해 scanner.nextLine(); 를 추가해줬다.
</aside>
showMainMenu 값을 사용해서 값 선택하면 메인 메뉴 안보이고 뒤로가기 했을때는 메인메뉴 보이게
<aside> 📌
메인 메뉴에서 숫자를 골라서 들어가면 그 안에 있는 메뉴를 보여줘야 하는데 메인 메뉴도 보여주고 안에 메뉴도 보여주고 있길래 boolean 값을 줘서 메인 메뉴에서 숫자 선택을 하면 showMainMenu값을 false로 바꿔서 안쪽 메뉴만 보이게 해줬다. 그리고 뒤로가기 할때는 true값으로 변경. 여기서도 무한 루프가 일어났는데 continue로 건너뛰기 해주니까 잘 작동했다.
</aside>
index로 바로 못 가져오고 .get으로 가져와야 하는 이유
<aside> 📌
자바스크립트에서는 List 이런 거 없이 배열로 다 해결했었는데 자바는 배열 따로 리스트 따로~ 그래서 리스트에 접근할 때 바로 [i]로 가져올 수가 없다! List는 배열처럼 동작하게 하려면 메서드를 이용해서 해야한다. 그래서 값을 가져올 때 .get(i) 해서 가져올 수 있었다. 더미 데이터를 가져와서 사용할 때 menus.get(i).getCategory()으로 가져와서 사용했고 상세 메뉴 출력할 때도 겟으로 가져와서 사용했다.
</aside>
캡슐화 작업
<aside> 📌
필드에 직접 접근하지 못하도록 설정하기 위해 private을 사용했고 변경 가능성이 있을 것 같으면 final을 제외 변경 가능성이 없을 것 같으면 final 추가했다.
</aside>