Troubleshooting: 무엇이 문제였는가?/본캠프 2주 차: 키오스크 만들기

2단계: "숫자를 아무리 더해도 1만 나올 때 심정이란?"

writingforever162 2024. 11. 24. 22:13

[해결하려 한 원래 문제]

문제 소개 REVIEW 007 링크

 

[해결 과정 중 겪은 문제]

package com.example.kiosk.level2;
// [A] MenuItem 클래스
public class MenuItem {

    private String name;
    private double price;
    private String description;
    public int menuNum=1;
    // [수정 전] 멤버변수 총 3개: name, price, description
    // [수정 후] 멤버변수 총 4개: menuNum 추가 선언 및 1로 초기화

    public MenuItem(String name, double price, String description) {
        this.name = name;
        this.price = price;
        this.description = description;
    }

    public void getEachItem() {
        System.out.println(this.menuNum+". "+this.name + "     | W " + this.price + " | " + this.description);
        this.menuNum++;
        /*
        [수정 전]
        System.out.println(this.name + "     | W " + this.price + " | " + this.description);
        [수정 후]
        [1] println() 안에 추가: this.menuNum+". "+
        [2] println() 밑에 추가: this.menuNum++;
         */
    }
}
package com.example.kiosk.level2;
// [B] main

import java.util.*;

public class KioskLvTwo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println();
        System.out.println("[ GRILL&THRILL MENU ]");
        List<MenuItem> menuItems = new ArrayList<>();

        MenuItem basicBurger = new MenuItem("BasicBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거");
        MenuItem grilledThrill = new MenuItem("GrilledThrill", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거");
        MenuItem cheeseburger = new MenuItem("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거");
        MenuItem hamburger = new MenuItem("Hamburger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거");

        Collections.addAll(menuItems, basicBurger, grilledThrill, cheeseburger, hamburger);

        for (MenuItem eachItem : menuItems) {
            eachItem.getEachItem();
            /*
            [수정 전]
            int menuNumber = 1;
            for (MenuItem eachItem : menuItems) {
                System.out.print((menuNumber++) + ". ")
                eachItem.getEachItem(); 
            }
            [수정 후] 
            [1] 변수 선언 없이 향상된 for문 작성 
            [2] 삭제: System.out.print((menuNumber++) + ". ")
             */
        }
        System.out.println("0. 종료           | 종료");
    }
}

getEachItem() 메서드와 print() 메서드를 같이 쓰지 않고 getEachItem()만 쓰려고 했다가 숫자 1만 나열되어서 그냥 원래 코드로 제출해 버릴까 진지하게 고민했다. 개발에서는 콘솔(console)에 출력된 문장만이 정답이라 제출해도 상관은 없었지만, 자존심이 허락하지 않았다.

 

[원인]

package com.example.kiosk.level2;
// [A] MenuItem 클래스
public class MenuItem {

    private String name;
    private double price;
    private String description;
    public int menuNum=1;
    /*
    [오답] 정수형 타입 menuNum 선언 및 1로 초기화
    [정답] static을 사용하거나 매개변수를 활용하거나
     */

    public MenuItem(String name, double price, String description) {
        this.name = name;
        this.price = price;
        this.description = description;
    }

    public void getEachItem() {
        System.out.println(this.menuNum+". "+this.name + "     | W " + this.price + " | " + this.description);
        this.menuNum++;
    }
}

원인은 MenuItem 클래스에서 정수형 int 타입 변수 menuNum을 선언하고 1로 초기화한 데에 있었다. 의도와는 다르게, getEachItem() 메서드를 호출할 때 1에 1이 더해져 2가 되었다. 이 부분은 메인(main)에서 향상된 for문을 수정 없이 두 번 썼을 때 확인할 수 있다.

package com.example.kiosk.level2;
// [B] main

import java.util.*;

public class KioskLvTwo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println();
        System.out.println("[ GRILL&THRILL MENU ]");
        List<MenuItem> menuItems = new ArrayList<>();

        MenuItem basicBurger = new MenuItem("BasicBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거");
        MenuItem grilledThrill = new MenuItem("GrilledThrill", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거");
        MenuItem cheeseburger = new MenuItem("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거");
        MenuItem hamburger = new MenuItem("Hamburger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거");

        Collections.addAll(menuItems, basicBurger, grilledThrill, cheeseburger, hamburger);

        for (MenuItem eachItem : menuItems) {
            eachItem.getEachItem();
        }
        System.out.println("0. 종료           | 종료");

        System.out.println();

        for (MenuItem eachItem : menuItems) {
            eachItem.getEachItem();
        }
        System.out.println("0. 종료           | 종료");
    }
}

확인 차원에서 위와 같이 향상된 for문을 두 번 쓴 다음 프로그램을 실행했다.

그나마 종료 문구는 반복문 밖에 작성해서 일관되게 0이 출력되니 다행이라고 해야 할까. 머리를 싸맨 끝에 튜터님과 팀원분에게 힌트를 얻어 두 가지 해결법을 얻었다. 누구에게 물어보든 정답을 바로 알려주지 않고 스스로 할 수 있도록 힌트만 주어서 진심으로 감사했다.

 

[해결]

(1) 1111 말고 1234 출력하기 by static

(2) 1111 말고 1234 출력하기 by 매개변수