이 문제는, 김영한의 자바 입문 강의에 , 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
프로그램을 종료 합니다!
출력 결과, 숫자가 아닌 다른 문자열과 같은 경우 예외처리된 모습을 볼 수 있었습니다
'코딩테스트' 카테고리의 다른 글
[2024 KAKAO WINTER INTERNSHIP]가장 많이 받은 선물 [파이썬] (0) | 2024.01.10 |
---|---|
[Python][CodingTest] 정수 삼각형 - 동적 계획법(Dynamic Programmging) (0) | 2023.12.28 |
[Java] 배열+반복문으로 각 학생의 총점, 평균 계산 (0) | 2023.12.20 |
[Python][CodingTest] 달리기 경주 (2) | 2023.12.20 |
[Python] 수열과 구간 쿼리 2, 3 (0) | 2023.12.15 |