키오스크 도전 Lv.2 구현과 리팩토링 / abstract와 Interface, 어떻게 써야할까?

말하는 감자·2025년 3월 11일

내일배움캠프

목록 보기
16/73

오늘도 시작

어제 끝나기전에 오늘 할일 지정해줘서 오늘 다 끝내볼 생각이다!!

오늘 할 일

  • 클래스 분리하기
  • 람다, 스트림 써서 출력하는 함수 리팩토링 하기
  • 장바구니 내용 수정하는 기능 (하나 골라서 삭제)

클래스 분리하기 & 깃 컨벤션 수렴

클래스 분리하기

어제 얘기했다싶이 키오스크가 하는 일이 너무많아서 조금 분리해주고 싶었다.
많이 떼내는 것도 좀 복잡해질 것 같아서
입력값 검증하는 정도만 떼서 계산기 때 처럼 UserInputManager 클래스 생성해주고 거기서 검증했다

원래 없었던 기능이 새로 생긴건데, sc.nextInt를 옆에서 받을 때 int로 받지말고 버퍼 전체 받아주고 이게 정수인지?? 검증하는 단계임..
나중에 키오스크에 다른 기능이 생겨서 스트링이나 실수값을 받을 때 여기 함수만 늘려주면 확장성에 좋지 않을까?? 싶어서 만들어봣따.

어제 틀만 만들어놨던 클래스의 내용을 채워주고왔다!!! 어제 게시글에 채워진 코드가 있다. ㅎㅎ

깃 컨벤션

어제 계산기 과제 피드백이 왔다

이번 과제에서는 피드백에 주신 내용을 토대로 커밋 메시지를 좀 개선할 생각이다!!
https://treasurebear.tistory.com/70
여기서 깃 이모지를 잘 설명해놨길래 참고를 하며 작성했다.

다시보니 영어 외 다른 문자....는 꺠진다구...???? 이제부터라도 영어를 좀 써야겠다.

https://github.com/Ksr-ccb/Sparta-Kiosk
여기는 이번 키오스크 과제 깃허브!

++) 튜터님께 물어보고왔다!!!!!!

📌 커밋은 최대한 세세하게 나눠서 진행하자!

변수명이 바뀌어도 커밋, 뭔갈 한줄이 바뀌어도 커밋
깃 이모지를 보면 엄청내용이 세세하게 나눠져있다. 이를 잘 적용하기 위해서 그만큼 커밋을 세세하게 나눠서 해야한다 😢😢
흑흑 이제부터라도..6^^ ㅜㅜ

장바구니 내용 수정하는 기능 (하나 골라서 삭제)


이런흐름으로 장바구니 수정 함수를 작동시키게 한다.

    private boolean inputEditItem() {
        while (true) {
            shoppingCart.printEditMenu(); //장바구니 내용출력
            System.out.println("삭제할 메뉴를 선택해주세요.");
            try {
                itemInput = userInputManager.inputIntegerValue();
                if (itemInput < 0 || itemInput > shoppingCart.getCartLength()) {
                    throw new InputMismatchException();
                } else if (itemInput == 0) {
                    System.out.println("카테고리로 돌아갑니다.");
                    return false;
                }else{
                    shoppingCart.setCartItem(itemInput -1 );
                    // 돌아가기
                }
            } catch (InputMismatchException e) {
                System.out.println("메뉴에 있는 번호를 입력해주세요!");
            }
        }
    }

일단 장바구니 목록에서 입력된 값이 아니면 오류 메시지 출력하게 해줬는데, 여기서 나가고 싶을 수 있으니 0번일 경우도 고려해줘야한다..
그럼 수정하는 함수에서 리턴값이 bool로 나오게 해서 false값이면 장바구니 탐색하는 함수 빠져나오게 하면되겠다.

이렇게 해서 서비스 제공하는 부분은 다 완료된 것 같다.!!

흐름도에 오류가있어서 고쳤다
이게진짜진짜 완성본임


람다, 스트림 써서 출력하는 함수 리팩토링 하기

드디어왔다
사실 람다랑 스트림은 아직까지 익숙하지 않아서 미지의 세계임........무서벙
제일 먼저 스트림이 슬만한 곳은 리스트들을 출력하는 부분이다.

1. 카테고리 고르기


        for (int i = 0; i <length; i++) {
            System.out.println("|| " + (i + 1) + ". " + menuList.get(i).getCategoryName());
        }

        menuList.stream()
                .forEach(value->{
                        System.out.println("|| " + value.getCategoryNum()+ ". " + value.getCategoryName());
                    }
                );

2. 메뉴 출력하기

    for (int i = 0; i < menuItems.size(); i++) {
        MenuItem tempItem = menuItems.get(i);
        System.out.println("|| " + (i + 1) + ". " + tempItem.getName() + "\t | " + tempItem.getSinglePrice() + " | " + tempItem.getInfo());
        }
    menuItems.stream()
            .forEach(menuItem -> {
                int index = menuItems.indexOf(menuItem);
                System.out.println("|| " + (index + 1) + ". " + menuItem.getName() + "\t | " + menuItem.getSinglePrice() + " | " + menuItem.getInfo());
                });

📌 stream.foreach문이 정말 좋은건가요?

여기서 고민이 생겼다..
foreach문을 쓰면 인덱스를 찾을 수 없어서 int index = menuItems.indexOf(menuItem); 으로 인덱스를 찾아줘야 한다.
그럼 foreach문 안에서 탐색을 두번 진행하는 것 같아서 튜터님에게 여쭤보러기ㅏㅆ다왔따

확실하게 foreach문 안에서 인덱스 찾는건 비효율적이라 for문 돌리는 것이 낫다고 답변으 ㄹ받았다..!!!
foreach문 안에서 인덱스를 굳이굳이 써야겠다면

이런식으로 int를 밖으로 꺼내서 매 foreach문마다 새로운 index가 생성되는 것을 막고 int변수를 atomic으로 만들어줘야한다고 한다.!


이런식으로 index값을 변화시키는 것을 제한하는?? 그런..................그런...것이라고 하는데 사실 잘 모르겠다
튜터님도 지금 굳이 알필요가 없어용 하는 뉘앙ㅇ스로 말슴주셔서 이런게 잇다~~ 정도로만 이해하고 넘어가려고 한다.

✅ 결론

인덱스가 필요한 곳은 굳이 stream.foreach 쓰지말자!!!!!!!!!!!!!!!!!

3. 장바구니에서 총합 계산값을 구할 때

        for (Integer integer : price) {
            totalPrice += integer;
        }

totalPrice = price.stream().mapToInt(Integer::intValue).sum();

이게 제일 좋은거같당 ㅎㅋㅋ


반복문은 이걸로 끝났다.
이제는 음... Enum클래스 함수를 람다로 바꿀 수 있나??? 한번해보겠다!!

📌 abstract와 Interface, 어떻게 써야할까?



집중이 너무안돼서 그냥 손으로 썻다.
사실 완벽하게 이해는 안됐는데 왜 이렇게 ㅆ는지 까지정도만?? 아 그렇구나... 그래서 abstract메서드를 못쓰는구나...

이정도.......로 이해했음...

람다식을 쓰면 복잡한 조건문이나 sout을 자유롭게 사용할 수 없어서 함수마다 거쳐가는 가공이 많다면 abstract가 적당하다고 생각이 됨..

이후로는 readme에 올라갈 최종 구조사진을 개편했다...ㅎㅎ 블록놀이하는기분

내일은 이제 정말로 GUI... 한번해보고싶은데 적용 도전!

굿

profile
대충 데굴데굴 굴러가는 개발?자

0개의 댓글