김영한님의 자바 입문 영상에서 배열 - 문제와 풀이3 문제이다.
https://www.youtube.com/watch?v=JEzBDk0E9Rw&t=36151s


- 내가 먼저 써본 코드
package twodimensionarray;
import java.util.Scanner;
public class Product {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] productName = new String[10];
int[] productPrices = new int[10];
for (int i = 0, j = 0; i <= productName.length; i++) {
j = 0;
System.out.println("1. 상품 등록 | 2. 상품 목록 | 3. 종료");
System.out.print("메뉴를 선택하세요 : ");
int iNum = sc.nextInt();
if (iNum == 2 && productName[j] != null) { //상품 목록 코드
for (; j < i; j++) {
System.out.println(productName[j] + " : " + productPrices[j] + "원");
}
i--;
}
else if(iNum == 2 && productName[0] == null){ //상품 목록이 없을 때
i--;
System.out.println("상품 목록이 없습니다");
}
else if(iNum == 1 && i == 10){ // 상품을 10개까지 등록했는데 더 등록하려하면
System.out.println("더 이상 상품을 등록할 수 없습니다.");
i--;
}
else if (iNum == 1) { //상품 등록코드
System.out.print("상품 이름을 입력하세요 : ");
productName[i] = sc.next();
System.out.print("상품 가격을 입력하세요 : ");
productPrices[i] = sc.nextInt();
}
else if (iNum == 3) { //종료 코드
System.out.println("프로그램을 종료합니다.");
break;
}
else i--; //메뉴에서 숫자 1, 2, 3 말고 다른 걸 입력할 경우
}
}
}
크게 for문이 코드를 모두 감싸고 있으며 큰 for문 안에 else-if문이 들어 있는 형식이다.
큰 for문의 첫 시작이 j를 0으로 초기화를 계속하게 하는 것이다.
그 이유는 만약 j = 0; 코드가 없다면 상품목록을 처음 볼땐 괜찮은데 두 번째부터는 j의 값이 내가 상품을 등록한 만큼 증가 된다.
그래서 상품 목록 코드의 조건인 projectName(j) != null 이 성립하지 않고 상품 목록이 없을 때 코드의 조건을 만족해버려서 상품 목록이 있음에도 상품 목록이 없다고 나오기 때문이었다.
그래서 큰 for문이 실행을 한번 완수할 때마다 j의 값을 0으로 초기화해야했다.
그리고 웬만한 if문들에 i--;가 있다.
그 이유는 i의 값이 사용자가 메뉴에서 잘못된 입력, 올바른 입력 상관 없이 큰 for문이 한번 반복을 완료할때 마다 무조건 증가하기 때문이다.
그 때문에 배열에 유저에게 입력 받은 값을 순서대로 저장하지 못하고 띄엄띄엄 저장되는걸 방지하기 위함이다.
(예를 들어 배열의 첫번째 인덱스에 값을 넣었으나 다음 정보를 두번째에 넣는 것이 아닌 세번째에 넣는 경우를 방지한다.
위와 같은 상황이 일어나면 두번째 인덱스 값은 null이 되는 상황이 생긴다.
만약 상품 목록 코드에 i--; 문장이 없을 때 계속 실행하면 사용자는 상품 목록을 확인을 여러번 했을 뿐인데 i값이 계속 증가하여 배열 인덱스만 증가한다.)
이를 i--; 문장이 막아준다.
i의 값이 배열의 길이와 같거나 작을때 까지 반복하게 했다.
그 이유는 상품을 10개까지 등록했는데 더 등록하려하는 코드를 작동하게 하므로써 자동적으로 프로그램이 종료되는 것이 아닌 사용자가 직접 등록할 수 없다는 메세지를 보고 프로그램을 종료 시키게 하기 위함이다.
- 정답 코드
package array;
import java.util.Scanner;
public class ProductAdminEx {
public static void main(String[] args) {
int maxProducts = 10;
String[] productNames = new String[maxProducts];
int[] productPrices = new int[maxProducts];
int productCount = 0;
Scanner scanner = new Scanner(System.in);
while (true){
System.out.print("1.상품 등록 | 2. 상품 목록 | 3. 종료\n메뉴를 선택하세요:");
int menu = scanner.nextInt();
scanner.nextLine(); //\n 빼기용
if(menu == 1){
if(productCount >= maxProducts){
System.out.println("더 이상 상품을 등록할 수 없습니다.");
continue; //사용자가 다시 while 문으로 돌아가 선택할 수 있어야함
}
System.out.print("상품 이름을 입력하세요 :");
productNames[productCount] = scanner.nextLine(); //이걸 next()로 쓰면 위에 \n 빼기용 코드 안써도 됨
System.out.print("상품 가격을 입력하세요 :");
productPrices[productCount] = scanner.nextInt();
productCount++;
} else if (menu == 2) {
if(productCount == 0){
System.out.println("등록된 상품이 없습니다.");
continue;
}
for (int i = 0; i < productCount; i++) {
System.out.println(productNames[i] + " : " + productPrices[i] + "원");
}
} else if (menu == 3) {
System.out.println("프로그램을 종료합니다.");
break;
}else {
System.out.println("잘못된 메뉴를 선택하셨습니다.");
}
}
}
}
최대 값을 따로 maxProduct 변수로 선언해 가시적인 것 같고 productCount int형 변수를 따로 만들어서 반복문을 for이 아닌 while(true)로 돌리니 더 간단하다.
내가 for문을 사용하여 i값에 따른 결과가 달라져서 i--;를 적었던 것과 달리 while 문에다가 productCount를 늘리는 식으로 하니 더 간단했다.
별찍기 반복문 때도 느낀 것 이지만 for문 안의 i값에 따라 결과가 달라지면 그것을 해결하느라 힘들어하지 말고 따로 변수로 선언하여 해결하려는 사고를 늘려야 할 것 같다.
'오류, 기능, 문제해결(JAVA)' 카테고리의 다른 글
| 내배캠 2주차 자바 숙제 풀다가 iterator() 관련 문제 (0) | 2024.12.31 |
|---|---|
| 문자열 앞에 순차적으로 증가하는 숫자 붙이고 싶을때 배열써야됨 (1) | 2024.12.31 |
| 2차원 배열 연습 (3) | 2024.12.27 |
| scanner에서 무한 while 중단 조건 간략화 (0) | 2024.12.27 |
| scanner 사용 시 nextInt() 다음에 nextLine() 쓰면 (0) | 2024.12.27 |