강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

김대경님의 프로필 이미지
김대경

작성한 질문수

김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음

정리

코드에 대한 피드백 부탁드립니다.

작성

·

278

0

 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.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 인턴입니다.

제공해주신 코드를 보면 여러 면에서 유용하고 학습 목적에 맞게 잘 작성하신 것 같습니다. 다만, 가독성과 중복 최소화를 위해 몇 가지 제안을 드리겠습니다.

  1. 메뉴 선택 부분을 별도의 메소드로 분리할 수 있습니다. 이렇게 하면 main 메소드의 길이를 줄이고, 코드의 가독성을 향상시킬 수 있습니다.

  2. 상품 관련 기능(등록, 삭제, 목록 조회) 또한 각각 별도의 메소드로 분리할 수 있습니다. 이는 기능별 책임을 분리하고, 재사용성과 가독성을 높이는 데 도움이 됩니다.

  3. 입력 오류를 처리하는 로직을 추가하여 사용자가 숫자 대신 문자를 입력했을 때의 상황을 더 명확히 처리할 수 있습니다.

  4. 상품 삭제 기능에서 상품을 삭제한 후에는 그 뒤의 상품들을 앞으로 당겨야 합니다. 현재 로직에서는 삭제된 항목의 공간을 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("올바른 메뉴를 선택해주세요.");
            }
        }
    }
}
김대경님의 프로필 이미지
김대경

작성한 질문수

질문하기