[JAVA] final-Program-배달텍스트프로그램
Categories: JAVA-Practice
📌 개인적인 공간으로 공부를 기록하고 복습하기 위해 사용하는 블로그입니다.
정확하지 않은 정보가 있을 수 있으니 참고바랍니다 :😸
[틀린 내용은 댓글로 남겨주시면 복받으실거에요]
배달텍스트프로그램_V2
1번째 시도
아주 Nullpoint Exception 지옥이다.
- 안되는 부분 -1
-
빈배열 찾고 해당 인덱스 반환하는 메서드 먼저 사용할지, 아니면 등록된 shop여부를 찾고 빈배열을 찾을지 우선순위를 구해야하는데
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
int shopIdx =isValidShop(shops,SHOP_MAX,shopName); int currentIdx; //가게가 있다면 if(shopIdx!=-1){ shops[shopIdx]=new Shop(shopName); shop.addFood(signatureMenu,menuPrice); System.out.printf("[안내] %s에 음식(%s, %d) 추가되었습니다.", shopName, signatureMenu, menuPrice); System.out.println("[시스템] 가게 등록이 정상처리 되었습니다."); }else{ //가게가 없다면 currentIdx=isValidIndex(shops); if(currentIdx!=-1){ //가게 배열이 비었다면 등록 shops[currentIdx]=new Shop(shopName); shop.addFood(signatureMenu,menuPrice); System.out.printf("[안내] %s에 음식(%s, %d) 추가되었습니다.", shopName, signatureMenu, menuPrice); System.out.println("[시스템] 가게 등록이 정상처리 되었습니다."); }else{ System.out.println("등록할 수 있는 가맹점 수를 초과하엿습니다.");
- 가게 등록여부를 확인하고 배열이 비어있는지 여부를 확인하려하는데 NullPointerException 오류가 남… ⇒
because "shop[i]" is null
- 그래서 왜 그럴까 고민했더니…동일 shop인지 검증할 때 사용하는 메서드에는
- shop배열과 사용자가 입력한 shop이름만 일치하는지 일치한다면 해당 배열의 인덱스를 반환하기로 되어있는데
- 동일shop인지 검증할때 빈배열이면 null밖에 존재하지 않으니 null도 함께 검증해야한다
- 그래서 결국엔 null인지 먼저 검증 후 shop이 일치하는지 여부를 찾거나 이미 등록된 shop인지 검증하는 메서드에서 null값을 걸러내야하는데, 그것보단 전자가 나을 것 같다.!
- 가게 등록여부를 확인하고 배열이 비어있는지 여부를 확인하려하는데 NullPointerException 오류가 남… ⇒
-
- 안되는 부분 -2 /1번과 내용 비슷
-
isValidShop에서 for문 돌때 shop.length 사용 안하고 길이 따로 넣는 이유
- 등록된 가게가 있는지 찾을때 사용하는 메서드인데 등록된 가게만큼만 돌게 해야된다.
- 왜냐면 빈배열일경우 null값이 존재하기때문에 nullpoint exception이 발생하기 때문
-
그래서 빈배열을 다 “”빈 문자열로 초기화 하거나 , null이 존재하지 않게 배열의 길이를 따로 구해서
- 매개인자로 넣어줘야함.
- 여기서는 빈배열이 존재하는지 만약 존재한다면 몇번째 인덱스에 존재하는지 찾는 메서드를 이용하여 maxlength를 구한 후
- 매개인자로 넣어주고 있다.
-
- 안되는 부분 -3
-
상점이 있는데 new Shop으로 한것. >> new Shop이 아니라 기존 shop에 addFood해야함.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
int shopIdx = isValidIndex(shops); int currentIdx; // 빈 배열이 있다면 if (shopIdx != -1) { // 배열 내 상점이 존재하는지? currentIdx = isValidShop(shops, shops.length, shopName); if (currentIdx != -1) { **shops[currentIdx] = new Shop(shopName);** if (shops[currentIdx].addFood(signatureMenu, menuPrice)) { System.out.printf("[안내] %s에 음식(%s, %d) 추가되었습니다.", shopName, signatureMenu, menuPrice); System.out.println("[시스템] 가게 등록이 정상처리 되었습니다."); } } else { // 배열 내 상점이 없다면 빈 배열에 상점 저장 shops[shopIdx] = new Shop(shopName); if (shops[shopIdx].addFood(signatureMenu, menuPrice)) { System.out.printf("[안내] %s에 음식(%s, %d) 추가되었습니다.", shopName, signatureMenu, menuPrice); System.out.println("[시스템] 가게 등록이 정상처리 되었습니다."); } } } else { // 빈 배열이 없다면 currentIdx = isValidShop(shops, shops.length, shopName); if (currentIdx != -1) { // 상점이 존재 **shops[currentIdx] = new Shop(shopName);** if (shops[currentIdx].addFood(signatureMenu, menuPrice)) { System.out.printf("[안내] %s에 음식(%s, %d) 추가되었습니다.", shopName, signatureMenu, menuPrice); System.out.println("[시스템] 가게 등록이 정상처리 되었습니다."); } } else { // 상점이 없음 System.out.println("등록할 수 있는 가맹점 수를 초과하였습니다."); } }
shop에서 menu,price등록하는 메서드를 boolean type으로 만들었을 때 메서드에서 true, false만 반환하고 메서드 내에서 출력해야하는 건 안됨,
-
그래서 if절에서 메서드를 추가하면 안되고 따로 메서드 실행 해야함.
- 그래서 addFood메서드를 활용해서
- addFood가 성공했을때만 출력문이 발생하게끔함.
- addFood가 성공하면 isAddFood는 true를 유지하고
- 실패하면 false로 바뀐다.
-
-
addfood 메서드에서도 nullpoint Exception 발생했는데 메뉴나 price 에서 빈 배열의 경우 null값이 들어가기 때문이다, 그래서 초기화할때 빈 배열은 모두 “”빈문자열로 변경해줘야함.
-
2번째 시도
- 이미 배열내에 존재하면
- registerSuccess = shops[shopValidIdx].addFood(menuName, menuPrice);
- 배열 내에 존재하지 않을 때 -신규등록
- Shop shop = new Shop(shopName); shops[shopEmptyIdx] = shop;
- 1번 음식점+메뉴등록시
-
NPE 발생
-
이유-1 메인에서 생성자에서 초기화 안함(1)
기껏 initValues 메서드 만들어 놓고 생성자에서 초기화 안했음….
-
이유-2 Shop 클래스 생성자에서 초기화 안함(2)
기껏 initalMenuAndPrice 메서드로 초기화 만들어 놓고 생성자에서 초기화 안했음….
-
-
- 리뷰등록 할 때 1-5점만 입력하게 하고 싶을 때
-
메서드 하나 더 만들어서 등록
-
배달텍스트프로그램_V3
- 안되는 부분
- 처음 등록된 shop(shops의 index=0)을 제외한 새로운 가게의 첫번째 메뉴는 등록안하고, 두번째 등록부터만 등록됨
-
출력예시
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
[시스템] 무엇을 도와드릴까요? >>>1 aaa {ccc=10000, bbb=10000} [안내] 반갑습니다. 가맹주님! [안내] 음식점 상호는 무엇인가요? >>>def [안내] 대표 메뉴 이름은 무엇인가요? >>>aaa [안내] 해당 메뉴 가격은 얼마인가요? >>>10000 [안내] def에 음식(aaa,10000) 추가되었습니다.[시스템] 가게 등록이 정상 처리되었습니다. ---------------------------------------- 1) [사장님 용] 음식점 등록하기 2) [고객님과 사장님 용] 음식점 별점 조회하기 3) [고객님 용] 음식 주문하기 4) [고객님 용] 별점 등록하기 5) 프로그램 종료하기 ---------------------------------------- [시스템] 무엇을 도와드릴까요? >>>1 def {} aaa {aaa=10000, ccc=10000, bbb=10000} [안내] 반갑습니다. 가맹주님! [안내] 음식점 상호는 무엇인가요? >>>def [안내] 대표 메뉴 이름은 무엇인가요? >>>aaa [안내] 해당 메뉴 가격은 얼마인가요? >>>10000 [안내] def에 음식(aaa,10000) 추가되었습니다. [시스템] 가게 등록이 정상 처리되었습니다. ---------------------------------------- 1) [사장님 용] 음식점 등록하기 2) [고객님과 사장님 용] 음식점 별점 조회하기 3) [고객님 용] 음식 주문하기 4) [고객님 용] 별점 등록하기 5) 프로그램 종료하기 ---------------------------------------- [시스템] 무엇을 도와드릴까요? >>>1 def {aaa=10000} aaa {aaa=10000, ccc=10000, bbb=10000} [안내] 반갑습니다. 가맹주님! [안내] 음식점 상호는 무엇인가요? >>>def [안내] 대표 메뉴 이름은 무엇인가요? >>>bbb [안내] 해당 메뉴 가격은 얼마인가요? >>>10000 [안내] def에 음식(bbb,10000) 추가되었습니다. [시스템] 가게 등록이 정상 처리되었습니다. ---------------------------------------- 1) [사장님 용] 음식점 등록하기 2) [고객님과 사장님 용] 음식점 별점 조회하기 3) [고객님 용] 음식 주문하기 4) [고객님 용] 별점 등록하기 5) 프로그램 종료하기 ---------------------------------------- [시스템] 무엇을 도와드릴까요? >>>1 def {aaa=10000, bbb=10000} aaa {aaa=10000, ccc=10000, bbb=10000} [안내] 반갑습니다. 가맹주님! [안내] 음식점 상호는 무엇인가요? >>>
➡️ 가게 등록시에 등록된 shop의 이름과 등록된 menu와 가격을 볼 수 있게 해둠 처음으로 등록된 가게 aaa에 메뉴를 ccc와 bbb를 등록할 때는 문제 없이 등록이 잘 되었음
➡️ 그런데 두번째로 등록할 가게인 가게 이름 : def 에 음식 aaa와 가격 10000원을 추가했더니 aaa라는 가게에 메뉴aaa가 등록된 것을 볼 수 있음
def라는 가게는 생성되었으나 비어있는 arraylist를 가지고 있음
-> 그래서 다시 aaa를 추가했더니 등록된 메뉴라는 말도 안뜨고 정상적으로 추가됨
그래서 추가로 def에 bbb라는 메뉴를 추가했고 정상처리가 되었다.
결국 1번째 메뉴는 다른 shop에 등록되고, 2번째와 3번째 메뉴는 정상등록됨 -
-
아무래도 노란박스로 넘어오는듯…
- def 가게에 aaa가 def에 등록되어야하는데, 기존에 있던 aaa에 등록됨.
-
노란박스부분에 수정해줌.
- Arraylist의 마지막 배열에 추가 하고싶을 때 shops.add(size()-1,object)이 아니라 shops.add(object)또는 shops.add(shops.size(),object)로 추가해야 함.
- 결국 노란박스 부분만 살리면 되고 위에 빨간 박스 부분은 삭제하면 됨
- arraylist에서 index 를 꼭 알아야 add할 수 있다고 생각했는데 index몰라도 add하면 어짜피 맨 마지막 index에 추가 됨
- 처음 등록된 shop(shops의 index=0)을 제외한 새로운 가게의 첫번째 메뉴는 등록안하고, 두번째 등록부터만 등록됨
-
안되는 부분 -2, NPE 발생
-
NPE발생
1 2 3 4 5 6 7
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.ArrayList.add(Object)" because "this.orders" is null at jungmin.kdelivery.KDeliveryMain.deliveryOrder(KDeliveryMain.java:117) at jungmin.kdelivery.KDeliveryMain.main(KDeliveryMain.java:209) Process finished with exit code 1
이유 orders 초기화 하는 거 깜 박 함…!
-
- Reference와 나의 차이점
- Arraylist를 초기화 할 때 Reference : 필드에서 초기화 VS 나 : 생성자
- 둘 다 객체를 생성해도 동일한 초기값을 가짐
- 필드에서 할 경우
- 모든 생성자에서 동일한 초기값을 사용하게 됨
- 코드가 간단하고 명확하며
- 가본값을 항상 일관되게 설정 할 수 있음
- 생성자 에서 할 경우
- 생성자는 생성자 오버로딩이 가능하므로 유연하게 사용가능
- 즉, 매개변수에 따라 초기화가 달라져야할 때 유용
- Arraylist를 초기화 할 때 Reference : 필드에서 초기화 VS 나 : 생성자
Leave a comment