TIL)프로그래밍 기초_23.06.02(개인과제 완)

주민·2023년 6월 2일
0

TIL

목록 보기
11/84

어제꺼 이어서 작업했다.
TIL 작성법

문제(java)

가상의 메뉴판을 하나 만들고 상품을 선택하여 주문하기, 취소하기에 기능을 가진 키오스크 만들기

  • 메인 메뉴판 -> 상품 메뉴판 -> 구매화면 -> 주문화면 -> 주문완료 화면 -> 주문취소 화면
  • 필수 요구사항
    - 메뉴 클래스는 이름, 설명 필드를 가지는 클래스로 만들어주세요.
    - 상품 클래스는 이름, 가격, 설명 필드를 가지는 클래스로 만들어주세요.
    - 상품 클래스의 이름, 설명 필드는 메뉴 클래스를 상속받아 사용하는 구조로 개발해주세요.
    - 주문 클래스도 만들어서 상품 객체를 담을 수 있도록 해주세요.

문제풀기

  • 클래스는 크게 두가지로 나뉜다 => 데이터 or 실행 파일
  • 출력할 필드 setter, getter 각각 선언
  • list로 만들어 get으로 출력
  • 각 화면을 print로 만들고 선택해야하는 부분은 Scanner를 사용하기
  • 다른 화면으로 이동은 페이지별 메서드 만들어서 main에서 호출
  • 선택지가 많은 경우 swich문 사용
  • 메뉴 클래스(부모), 상품 클래스(자식) 으로 선언한 필드 상속
  • 기본 클래스 메뉴,상품,주문에 출력용으로 스크린,키오스크 추가하여 진행

각 메뉴를 print로 만들고 이동시 필요한 정보(input)은 scanner로 받아서 정보에 따라 맞는 페이지를 출력한다.

++ 메뉴판 내용을 매개변수 -> List로 출력하기로 했다.


오류 & 해결
1. 메인 메뉴 출력 -> 상품 메뉴 출력을 하고 반복문을 돌리니 반복할 수록 메인 메뉴가 중복되서 나온다. 메인 메뉴 메소드에 add가 있어 반복때마다 List에 추가되는 모양

    public void mainMenu() {
        mainMenus.add(new Menu(1, "Coffee", "다양한 원두가 있는 커피"));
        mainMenus.add(new Menu(2, "NonCoffee", "프라페, 차 등의 다양한 음료"));
        mainMenus.add(new Menu(3, "Cake", "투썸만에 오리지널 케잌과 계절감 있는 다양한 케이크"));

        for(Menu val: mainMenus){
            System.out.println(val.num + " . " + String.format("%-10s",val.name) + "|" + val.detail);
        }
    }

메소드 호출하면 추가되는 건 어쩔 수 없는 부분이라 add와 output으로 분리해서 해결했다.

    public void mainMenu() {
        mainMenus.add(new Menu(1, "Coffee", "다양한 원두가 있는 커피"));
        mainMenus.add(new Menu(2, "NonCoffee", "프라페, 차 등의 다양한 음료"));
        mainMenus.add(new Menu(3, "Cake", "투썸만에 오리지널 케잌과 계절감 있는 다양한 케이크"));
    }
    
        public void mainMenuOutput() {

        for(Menu val: mainMenus){
            System.out.println(val.num + " . " + String.format("%-10s",val.name) + "|" + val.detail);
        }

2. 상품을 하나 담을때마다 출력하고 List에 추가할 건지 확인을 해야하는는데 지금 담은 상품이 아니라 전체 상품이 나온다. for문을 돌려서 하나만 출력하거나 get,set 사용 둘 중에 고민 했는데 get을 써보기 위해 이 방법을 선택했다. 자료도 많이 찾고 우여곡절이 많았다! 찾은 내용은 밑에 정리할 예정
  orderMenu = sc.nextInt();

  product.setNum(screen.coffeeList.get(orderMenu).num);

  orderList.add(new Product(product.getNum(), 	product.getName(), product.getPrice(), product.getDetail()));

3. 세팅하고 값을 받아오는데 이상한 값을 계속 출력한다. 고민하다가 튜터님께 갔는데 또 같이 한참 고민하다가 예상외에 사유를 찾았다. get()< 안에 변수를 입력했는데 3까지 돌아가는 반복문 안에 넣어서 최종 값인 3만 출력되는 거였다. 스캐너로 받은 값에 -1해서 반복문 제거하니 해결 완료!
orderMenu = sc.nextInt();

orderMenu = orderMenu - 1;

product.setNum(screen.coffeeList.get(orderMenu).num);
product.setName(screen.coffeeList.get(orderMenu).name);
product.setPrice(screen.coffeeList.get(orderMenu).price);
product.setDetail(screen.coffeeList.get(orderMenu).detail);

알게 된 점

  1. print만 있는 메소드라면 반복문을 돌려도 동일하게 나오지만 add로 리스트에 추가하는 코드가 있는 메소드라면 리스트 내용이 계속 추가된다, 왠만하면 둘은 분리해서 쓸 것

  2. 우선 get,set은 위와 같은 내용으로 쓰는 건 옳지 않다.
    기본적으로는 다른 클래스에 있는 고정되어 있는(수정은 가능) 값을 get으로 가져오는 것인데 2번 해결책의 경우 set에 계속 덮어씌우는 방법이라 좋은 방법이라 볼 수 없다.

  • 하는 방법
* 선언(필드별로 해야함)
    public void setNum(int num){
        this.num = num;
    }
    public int getNum(){
        return num;
    }
* 데이터 세팅, 가져오기는 위 선언한 필드를 인스턴스로 가져온 클래스에서 가능   
 - set 설정
 product.setName("boby");
 - 출력(결과 동일)
 System.out.println(product.name);
 System.out.println(product.getName());
 - add
 orderList.add(new Product(product.getNum(), product.getName());
  1. 실행되는 순서대로 보다보면 알 수 있는 오류였다. 짤때나 오류났을때나 전체적인 내용을 확인해볼 것!!

0개의 댓글

관련 채용 정보