작성
·
278
0
package array;
import java.util.Scanner;
public class ArrayEx10_1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] productName = new String[10];
int[] productPrice = new int[10];
int productCount = 0;
while (true) {
System.out.println("1. 상품 등록 | 2. 상품 삭제 | 3. 상품 목록 | 4. 종료\n메뉴를 선택하세요." );
String options = scanner.nextLine();
if (options.equals("1") && productCount < 10) {
System.out.print("상품 이름을 입력하세요: ");
productName[productCount] =scanner.nextLine();
System.out.print("상품 가격을 입력하세요: ");
productPrice[productCount] =scanner.nextInt();
productCount++;
scanner.nextLine();
}
else if (options.equals("1") && productCount == 10) {
System.out.println("더 이상 상품을 동록할 수 없습니다.");
}
else if (options.equals("2") && productCount > 0) {
for (int i = 0; i < productCount; i++) {
System.out.println((i+1) + ". "+ productName[i] + ": " + productPrice[i] + "원");
}
System.out.println("삭제할 품목의 번호를 입력해주세요.");
int delNum = scanner.nextInt();
if ((delNum-1) < productCount) {
productName[delNum-1] = null;
productPrice[delNum-1] = 0;
productCount--;
System.out.println(delNum + "번 품목이 삭제되었습니다.");
scanner.nextLine();
}
else {
System.out.println("올바른 품목의 번호를 입력해주세요.");
scanner.nextLine();
}
}
else if (options.equals("2") && productCount == 0) {
System.out.println("삭제할 품목이 없습니다.");
}
else if (options.equals("3") && productCount > 0) {
for (int i = 0; i < productCount; i++) {
System.out.println((i+1) + ". "+ productName[i] + ": " + productPrice[i] + "원");
}
}
else if (options.equals("3") && productCount == 0) {
System.out.println("등록된 상풍이 없습니다.");
}
else if (options.equals("4")) {
System.out.println("프로그램을 종료합니다.");
break;
}
else {
System.out.println("올바른 메뉴를 선택해주세요.");
}
}
}
}
실습을 하다가 삭제기능도 있었으면 해서 만들어 봤습니다.우선, 강의를 봤을 때와 조금 다르게 만든거 같구요. 메뉴를 선택할 때 글자를 넣으면 오류가 떠서 스트링형으로 바꿨습니다.답변 2
1
안녕하세요, 인프런 AI 인턴입니다.
제공해주신 코드를 보면 여러 면에서 유용하고 학습 목적에 맞게 잘 작성하신 것 같습니다. 다만, 가독성과 중복 최소화를 위해 몇 가지 제안을 드리겠습니다.
메뉴 선택 부분을 별도의 메소드로 분리할 수 있습니다. 이렇게 하면 main 메소드의 길이를 줄이고, 코드의 가독성을 향상시킬 수 있습니다.
상품 관련 기능(등록, 삭제, 목록 조회) 또한 각각 별도의 메소드로 분리할 수 있습니다. 이는 기능별 책임을 분리하고, 재사용성과 가독성을 높이는 데 도움이 됩니다.
입력 오류를 처리하는 로직을 추가하여 사용자가 숫자 대신 문자를 입력했을 때의 상황을 더 명확히 처리할 수 있습니다.
상품 삭제 기능에서 상품을 삭제한 후에는 그 뒤의 상품들을 앞으로 당겨야 합니다. 현재 로직에서는 삭제된 항목의 공간을 null로 남기고 있어, 상품 목록의 연속성에 문제가 생길 수 있습니다.
절차지향적으로 작성된 이 코드를 객체지향적인 방법으로 리팩토링하는 것도 한 가지 방법이 될 수 있습니다. 예를 들어, Product
라는 클래스를 만들어 상품 정보를 관리하고, ProductManager
같은 클래스에서 상품 등록, 삭제, 조회 기능을 관리하도록 하는 것입니다. 이렇게 구조를 변경하면 코드가 더 유연하고 확장 가능해집니다.
강의 내용과 질문하신 내용이 직접적으로 일치하지 않기 때문에, 구체적으로 강사님께서 어떻게 하셨을지는 정확히 말씀드리기 어렵습니다. 하지만 위에서 제안드린 방법들은 일반적으로 코드의 구조와 가독성을 개선하는 데 도움이 될 것입니다.
0
주신 코드를 바탕으로 삭제코드까지 구현하여 정리해보았습니다.
메뉴가 정해져있다면 switch를 선호함. (개인취향)
early return(얼리리턴)으로 실행되면 안되는 조건은 분기문 내에서 작동하기 전에 미리 튕겨내는 것을 목표로 둠. else if의 향연 보다 짤막한 if가 낫더라..
상품 목록들을 보여주는 부분은 향상된 for문을 충분히 사용할 수 있으나 인덱스가 필요하다면 사용할 수 없다.
조건문 안에 되도록이면 조건을 복잡하지 않게 두는 게 개인적으로는 나중에 다시 볼 때 더 좋더라구요. .eqauls 같은 것도 좋긴 하지만 타입미스매칭 에러보기 싫다고 런타임에러나 예기치못한 결과가 나오는 불상사가 나오면.. 진짜 골치아파서요. 당장 객체나 메서드를 사용하지 않고 배열만으로 구현해본다면.. 이렇게 짤 수 있을 것 같아 답글 남겨 봅니다. 원리라면 변수 옮겨담기와 비슷하다고 생각하시면 됩니다. 다음 배열에 있는 값을 삭제한 곳에 담는 것! 조건은 상품수량과 삭제할 품목 숫자 + 증가값이 같아지는 때까지..로 정했습니다. 그래야 순차적으로 다 옮길 수 있는 것 같아서요. 코드 첨부하며 이만 말을 줄입니다.
package inflearn.array.ex2;
import java.util.Scanner;
public class Qna {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] productName = new String[10];
int[] productPrice = new int[10];
int productCount = 0;
while (true) {
System.out.println("1. 상품 등록 | 2. 상품 삭제 | 3. 상품 목록 | 4. 종료\n메뉴를 선택하세요.");
int options = scanner.nextInt();
scanner.nextLine();
if (options == 1) {
if(productCount == 10){
System.out.println("더 이상 상품을 동록할 수 없습니다.");
continue;
}
System.out.print("상품 이름을 입력하세요: ");
productName[productCount] = scanner.nextLine();
System.out.print("상품 가격을 입력하세요: ");
productPrice[productCount] = scanner.nextInt();
productCount++;
scanner.nextLine();
} else if (options == 2) {
if(productCount < 1){
System.out.println("삭제할 품목이 없습니다.");
continue;
}
if(productCount > 10){
System.out.println("올바른 품목의 번호를 입력해주세요.");
continue;
}
for (int i = 0; i < productCount; i++) {
System.out.println((i + 1) + ". " + productName[i] + ": " + productPrice[i] + "원");
}
System.out.println("삭제할 품목의 번호를 입력해주세요.");
int delNum = scanner.nextInt();
scanner.nextLine(); // \n
if(delNum > productCount || delNum < 1){
System.out.println("올바른 품목의 번호를 입력해주세요.");
continue;
}
int cnt = 0;
while(productCount == delNum + cnt) {
String varS = productName[delNum];
int varI = productPrice[delNum];
productName[delNum - 1 + cnt] = varS;
productPrice[delNum - 1 + cnt] = varI;
cnt++;
}
productCount--;
System.out.println(delNum + "번 품목이 삭제되었습니다.");
}
else if (options == 3) {
if(productCount < 1){
System.out.println("등록된 상풍이 없습니다.");
continue;
}
for (int i = 0; i < productCount; i++) {
System.out.println((i + 1) + ". " + productName[i] + ": " + productPrice[i] + "원");
}
} else if (options == 4) {
System.out.println("프로그램을 종료합니다.");
break;
} else {
System.out.println("올바른 메뉴를 선택해주세요.");
}
}
}
}
고맙읍니다