본문 바로가기
코딩테스트

[Java] 상품 관리 프로그램 만들기 [기초]

by 우지uz 2023. 12. 21.

이 문제는, 김영한의 자바 입문 강의에 , 8 섹션 배열 파트 마지막 예제입니다. 
문제 설명과 풀이에 대해 공유 하도록 하겠습니다.

 
 

1 Try. 

package array.ex;
import java.util.Scanner;
public class ArrayEx9 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        String[] productNames = new String[10];
        int[] productPrices = new int[10];
        int productCount = 0;

        while (true) {
            System.out.println("1. 상품 등록 | 2. 상품 목록 | 3. 종료 ");
            int inputNumber = input.nextInt();
            System.out.println();
            if (inputNumber == 1) {
                if (productCount >= 10) {
                    System.out.println("더 이상 상품을 등록할 수 없습니다.");
                    break;
                }
                System.out.println();
                System.out.println("상품 이름을 입력하세요 : ");
                productNames[productCount] = input.nextLine();
                System.out.println();
                System.out.print("상품 가격을 입력하세요 : ");
                productPrices[productCount] = input.nextInt();
                productCount++;
            } else if (inputNumber == 2) {
                for (int i = 0; i <= productCount; i++) {
                    System.out.println(productNames[i] + " : " + productPrices[i]);
                }
            } else {
                System.out.println("프로그램을 종료 합니다!");
                break;
            }

        }
    }
}

출력 결과, 상품 등록시에 상품 이름을 입력받지 않고 상품 가격으로 넘어가게 되었습니다.

문제점 1 : 메뉴를 선택하세요를 빼먹었습니다.
문제점 2 : 공백을 굳이 많이 넣어버렸네요
문제점 3 : 상품 이름을 건너뛰었다. -> 1,2,3 번 선택시 엔터를 쳐야하는데, 엔터칠때 넘어가버림.
문제점 4 : 상품 목록을 볼때, 마지막에 null : 0  이라고 나오는 에러

input.nextLine(); // 다음 줄로 넘어가기

이걸로 문제점 3을 해결했고 

문제점 1은 

System.out.print("1. 상품 등록 | 2. 상품 목록 | 3. 종료 \n 메뉴를 선택하세요 : ");

다음과 같이 수정

문제점 2는 

System.out.print("1. 상품 등록 | 2. 상품 목록 | 3. 종료 \n 메뉴를 선택하세요 : ");
int inputNumber = input.nextInt();
input.nextLine(); // 다음 줄로 넘어가기
if (inputNumber == 1) {
    if (productCount > n) {
        System.out.println("더 이상 상품을 등록할 수 없습니다.");
        break;
    }
    System.out.print("상품 이름을 입력하세요 : ");
    productNames[productCount] = input.nextLine();

    System.out.print("상품 가격을 입력하세요 : ");
    productPrices[productCount] = input.nextInt();

println() 을 삭제해주었습니다. 

문제점4 , 상품 목록 선택시 , null : 0 은 왜 나타나는 걸까 ?

잘 생각 해보니, 

else if (inputNumber == 2) {
    for (int i = 0; i <= productCount; i++) {
        System.out.println(productNames[i] + " : " + productPrices[i] + "원");
    }

이 부분이 상당히 거슬렸습니다... 상품 개수가 3개면 
i = 0 , 1, 2  일때만 상품 이름, 가격을 출력 해주면 되는데 
<= 작거나 같은 i 에 대해서 for 반복문이 돌고 있기 때문에 
실제 존재하지 않는 상품 목록에 대해서 null 이 반환되었던 것이었습니다. 
그래서 변경 해주었습니다. 

2Try 성공!

package array.ex;
import java.util.Scanner;
public class ArrayEx9 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = 10;
        String[] productNames = new String[n];
        int[] productPrices = new int[n];
        int productCount = 0;

        while (true) {
            System.out.print("1. 상품 등록 | 2. 상품 목록 | 3. 종료 \n 메뉴를 선택하세요 : ");
            int inputNumber = input.nextInt();
            input.nextLine(); // 다음 줄로 넘어가기
            if (inputNumber == 1) {
                if (productCount > n) {
                    System.out.println("더 이상 상품을 등록할 수 없습니다.");
                    break;
                }
                System.out.print("상품 이름을 입력하세요 : ");
                productNames[productCount] = input.nextLine();

                System.out.print("상품 가격을 입력하세요 : ");
                productPrices[productCount] = input.nextInt();

                productCount++;
            } else if (inputNumber == 2) {
                for (int i = 0; i < productCount; i++) {
                    System.out.println(productNames[i] + " : " + productPrices[i] + "원");
                }
            } else if (inputNumber == 3) {
                System.out.println("프로그램을 종료 합니다!");
                break;
            } else {
                System.out.println("잘못된 값을 입력하셨습니다.");
            }
        }
    }
}
1. 상품 등록 | 2. 상품 목록 | 3. 종료 
 메뉴를 선택하세요 : 1
상품 이름을 입력하세요 : 피자
상품 가격을 입력하세요 : 12900
1. 상품 등록 | 2. 상품 목록 | 3. 종료 
 메뉴를 선택하세요 : 1
상품 이름을 입력하세요 : 햄버거
상품 가격을 입력하세요 : 9800
1. 상품 등록 | 2. 상품 목록 | 3. 종료 
 메뉴를 선택하세요 : 1
상품 이름을 입력하세요 : 족발
상품 가격을 입력하세요 : 27000
1. 상품 등록 | 2. 상품 목록 | 3. 종료 
 메뉴를 선택하세요 : 2
피자 : 12900원
햄버거 : 9800원
족발 : 27000원
1. 상품 등록 | 2. 상품 목록 | 3. 종료 
 메뉴를 선택하세요 : 4
잘못된 값을 입력하셨습니다.
1. 상품 등록 | 2. 상품 목록 | 3. 종료 
 메뉴를 선택하세요 : 3
프로그램을 종료 합니다!

출력 결과, 문제의 의도대로 나온 것을 확인할 수 있었습니다. 
 
살짝 개인적으로 아쉬운 점이 있다면

1. 상품 등록 | 2. 상품 목록 | 3. 종료

를 입력받는 while 문에서
문자열을 입력하면 

1. 상품 등록 | 2. 상품 목록 | 3. 종료 
 메뉴를 선택하세요 : 문자열
Exception in thread "main" java.util.InputMismatchException
	at java.base/java.util.Scanner.throwFor(Scanner.java:947)
	at java.base/java.util.Scanner.next(Scanner.java:1602)
	at java.base/java.util.Scanner.nextInt(Scanner.java:2267)
	at java.base/java.util.Scanner.nextInt(Scanner.java:2221)
	at array.ex.ArrayEx9.main(ArrayEx9.java:13)

종료 코드 1(으)로 완료된 프로세스

당연히 InputMismatchException 예외처리가 된다는 점이었습니다. 
저는 문자열을 입력했을 때에도  프로세스를 진행하고 싶기때문에
try - catch 구문으로

java.util.InputMismatchException

가 났을 때, 숫자를 입력하라는

System.out.println("숫자를 입력하세요.");

와 함께, 다시 프로세스로 돌아가도록 했습니다. 
 
예외처리까지 !

package array.ex;
import java.util.Scanner;
public class ArrayEx9 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = 10;
        String[] productNames = new String[n];
        int[] productPrices = new int[n];
        int productCount = 0;

        while (true) {
            System.out.print("1. 상품 등록 | 2. 상품 목록 | 3. 종료 \n 메뉴를 선택하세요 : ");
            try {
                int inputNumber = input.nextInt();
                input.nextLine(); // 다음 줄로 넘어가기
                if (inputNumber == 1) {
                    if (productCount > n) {
                        System.out.println("더 이상 상품을 등록할 수 없습니다.");
                        break;
                    }
                    System.out.print("상품 이름을 입력하세요 : ");
                    productNames[productCount] = input.nextLine();

                    System.out.print("상품 가격을 입력하세요 : ");
                    productPrices[productCount] = input.nextInt();

                    productCount++;
                } else if (inputNumber == 2) {
                    for (int i = 0; i < productCount; i++) {
                        System.out.println(productNames[i] + " : " + productPrices[i] + "원");
                    }
                } else if (inputNumber == 3) {
                    System.out.println("프로그램을 종료 합니다!");
                    break;
                } else {
                    System.out.println("잘못된 값을 입력하셨습니다.");
                }
            } catch (java.util.InputMismatchException e) {
                System.out.println("숫자를 입력하세요.");
                input.nextLine();
            }

        }
    }
}
1. 상품 등록 | 2. 상품 목록 | 3. 종료 
 메뉴를 선택하세요 : rlatjddn
숫자를 입력하세요.
1. 상품 등록 | 2. 상품 목록 | 3. 종료 
 메뉴를 선택하세요 : 싫어요
숫자를 입력하세요.
1. 상품 등록 | 2. 상품 목록 | 3. 종료 
 메뉴를 선택하세요 : 3
프로그램을 종료 합니다!

 
출력 결과, 숫자가 아닌 다른 문자열과 같은 경우 예외처리된 모습을 볼 수 있었습니다