lv2에서 생성자를 만들고 객체 선언 후 컬렉션에 추가
이후 컬렉션에서 값을 호출하는데 문제가 생김
get()으로 하니 주소값만 띄워주고 정작 내부 값을 안보여줌
ArrayList는 다른 클래스 타입을 가지고 있는 곳에서 get()으로 값을 호출하려고 하면
주소값만 보여주기 때문에 public String toString(){}으로 메서드를 만들어 값을 호출해 줘야함
또한 생성자를 MenuItem 클래스가 아니라 Main에서 작성해줬는데 아직 이유는 자세히 모른다(튜터님한테물어볼것)
위는 그냥 조건에 맞추기 위함 이후 캡슐화를 위해 다른 곳으로 옮겨줌
start함수를 만들어 관리하라는 소리가 쓰레드 run() start() 함수를 사용하라는 뜻으로 알고 잘못 생성함
또한 List자체가 생성자 타입으로 들어갈 수 있다는 것을 처음 앎 생성자 없이 진행
튜터님을 통해 생성자를 따로 만들 수 있다는 것을 알고 thread start()함수가 아니라 그냥 start라는 이름의 메서드로
묶어서 작성하라는 뜻이란걸 깨닫고 과제 의도대로 고침
또한 확장성을 위해 메뉴호출부를 for문으로 묶었고 주문했을때 출력되는 문구도 효율적으로 바꿈
Main 클래스에서 MenuItem 생성자를 통해 객체 생성하고 List.add();로 리스트에 추가했는데
이를 한번에 처리하는 List.of()라는 함수를 알고 나서 전부 지우고 다시 짬 코드 다이어트에 성공
Menu에 List를 옮기는데 문제가 많이 생김
List에 포함된 MenuItem을 순차적으로 보여주는 함수를 Kiosk에서 Menu로 옮겨왔는데 menuItems List가
적용이 안됨
Main에 Menu 객체 생성 및 위에서 생성한 List 객체 할당,
Kiosk.start() 함수에서 기존에 비어있던 매개변수를 Menu 타입의 menu로 받아와 해결
이는 Kiosk 내에 따로 Menu 클래스의 인스턴스화 없이도 이미 Main에 선언된 Menu 클래스의
인스턴스화를 끌어와서 가능한 것
category 리스트를 정의 및 값을 넣어주니 StackOverFlow가 발생
이유는 모르겠지만 Menu가 아닌 Kiosk에 category 리스트 값을 넣어주는 구문을 옮겨주니 정상 작동
알고보니 List.of 자체가 new를 반드시 포함해야하는데 이러면 Menu 안에 또 Menu 클래스를 객체화 시켜야 함으로
무한으로 재생성되기 때문
즉, List.of 자체가 List 선언된 클래스 내에선 사용 불가능하다.
장바구니를 만드는데 List를 사용했는데 도저히 어떻게 만들어야할지 감도 안잡혀서 포기함
결국 튜터님께 물어보고 List자체가 데이터에 어울리지 않기 때문에 Map 활용을 권장, 이를 따름
Map<MenuItem, Integer>로 앞에는 메뉴이름, 뒤에는 수량으로 정의함으로써 문제 해결
Kiosk 클래스 내 start()함수를 대대적으로 뜯어 고치기 시작 근데 if(!cartMap.isEmpty())가 제대로 작동하지 않음
이유는 ShoppingCart 클래스 내에 있던 Map을 아무생각 없이 Kiosk 클래스로 복붙해 왔기 때문에 Map 두개가 생겼었던 것 그래서 삭제 후if(!cart.cartMap.isEmpty()) 함수로 바꾸고 제대로 작동하는 것을 확인
이후 총 금액을 구하는 메서드를 적는데 두종류 이상의 메뉴가 들어가면 값이 따로 나오는 것을 확인
Map의 값을 다 추출하는 구문중 forEach를 사용했었는데 이것이 람다를 사용해서 바깥에서 정의된 값을
받아오지 못하는 오류가 생김
결국 어떻게 해야할지 감을 못잡다가, 도움을 받아 forEach가 아닌 for문에 Map.entry를 활용하는 것으로 해결
Map.entry 자체도 안에서 인스턴스화를 따로 해줘야한다는 것을 몰라서 좀 헤맸지만
MenuItem menuItem = entry.getKey();로 해결
UserDiscount 할일율을 적용시켜주라는 메서드가 필요한거지 상수별로 만들필요 없다는 것을 지적받음
choice 이름 구별이 안되서 직관적으로 바꾸라는 지적도 받음
enum 클래스를 구성하는데 비효율성을 지적 받아서 기존에 상수들을 일일이 대입해서
할인을 해주던 메서드를 전부 하나로 합침 상수랑 int값만 집어넣으면 알아서 할인값이 나오는 메서드로 변경
choice 변수명도 직관적으로 변경
for문을 stream화 시키는데 어려움이 있었음 Intstream.range 라는 것을 알게 되어 간단히 해결됨 Intstrea.range(a,b)로 사용되는데 첫번째는 for문의 int i = a라는 뜻이며 뒤의 b는 for문의 조건문이다. 증감연산자는 자동 적용인듯
Map은 stream화 하려면 entrySet()이나 keySet(), value() 을 사용해야함 이를 몰라서 좀 헤맸음
또한 삭제부분에서 .filter() 부분에 key가 대놓고 들어가는데 타입이나 안에 들어있는 값의 타입을 집어넣어야 하지 않나?
이부분도 이해가 안되니 튜터님께 물어볼것
알고보니 안에 들어가는 것은 타입이나 값의 타입이 아닌 단순 변수명이였다
key도 필수가 아니였고 바꿔도 하등 상관 없던것