오답 노트-자바(Java)

24.11.22(금) "1111 말고 1234 출력하기 by static" (2단계 키오스크)

writingforever162 2024. 11. 24. 22:41
package com.example.kiosk.level2;

public class MenuItem {

    /*
    [멤버 변수]
    [a] 객체로 생성될 때 메모리에 저장된다.
    [b] 객체마다 주솟값이 다르다.
     */
    private String name;
    private double price;
    private String description;
    public int menuNUm;
    // [수정 전] public int menuNUm=1;
    // [수정 후] public int menuNum;

    /*
    [정적 변수]
    [a] 멤버 변수와 달리 무조건 한 군데에만 저장된다.
    [b] 코드가 실행될 때 메모리에 저장되고 프로그램이 종료될 때만 삭제된다.
    [c] 즉, static을 자주 쓰면 메모리 낭비가 심해진다.
     */
    public static int counter = 1;
    // [작성 순서 1] static으로 변수 선언 및 1로 초기화하기

    public MenuItem(String name, double price, String description) {
        /*
        [정적 변수]
        [a] 정적 변수만 관리하는 메모리 공간이 따로 있다.
        [b] '클래스.변수명' 또는 '클래스.함수명'으로 호출한다.
        [c] 멤버 변수와 저장 공간 자체가 다르므로 counter에 this를 붙이지 않는다.
         */
        this.menuNUm = counter;
        counter++;
        // [작성 순서 2] 위의 두 줄 추가

        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++;
        // [수정 후] 삭제
    }
}

이 방법을 쓰면 메인(main)에서 별도로 수정할 필요가 없었다. 메모리 낭비가 심하다고는 하지만, 한 번 사용했다고 낭비라 말할 필요 또한 없었다.

챗GPT가 계산했다시피 변수 counter가 메모리에서 차지한 공간은 손톱만큼이나 작았으니까.

package com.example.kiosk.level2;

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. 종료           | 종료");
    }
}

메인(main)은 건들지 않고 MenuItem 클래스만 수정하여 원하는 대로 번호가 나오도록 수정하는 데에 성공했다.