Back-End

[JAVA] 콘솔에서 보는 프로그램 만들기

Minch13r 2025. 1. 3. 16:10

2025.1.3 처음에는 2일 복습하는 내용이다

package day006.class01;
//복습
public class Test01 {
    public static void main(String[] args) {
        int [] datas = new int[3];
        //3가지 조건
        for(int i=0;i<3;i++){
            datas[i]=(i+1)*10;
        }
        for(int v : datas){
            System.out.print(v + " ");
        }
    }
}

학생부 프로그램

package day006.student;

import java.util.Random;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        /* 학생부 프로그램은 무한루프로 진행, 종료 하려면 사용자가 원해야해서
        * */
        Scanner sc = new Scanner(System.in);
        Random rand = new Random();

        //배열 선언(학생부 내용 등록)
        final int LEN=3; //학생부에 저장될 수 있는 최대 학생 수 상수화
        int[] stuList = new int[LEN]; //학생부
        int cnt = 0; //현재 학생부에 저장된 학생 수

        while(true){
            System.out.println("===== 학생부 프로그램 =====");
            System.out.println("1. 전체출력");
            System.out.println("2. 1등 출력");
            System.out.println("3. 정보추가");
            System.out.println("4. 정보변경");
            System.out.println("0. 프로그램 종료");
            System.out.println("========================");
            System.out.print(">> ");
            int action = sc.nextInt();

            if(action == 0){ // 종료조건
                System.out.println("프로그램을 종료합니다");
                break;
            }

            else if (action == 1) { // 전체출력
                // 현재 저장된 학생들의 점수정보를 출력
                if(cnt<=0){ // UI/UX, 학생부에 학생이 없는 경우, ==0을 해도 되지만
                    //오류가 난 경우 -1이 될 수 있기에 <=이 더 낫다. 변수 차단
                    System.out.println("출력할 데이터가 없습니다.");
                    continue; //굳이 안 써도 되지만 continue를 쓰면 가독성이 좋아짐
                    // else를 안 써도 되기 때문이다.
                }
                for(int i=0; i<cnt; i++) { //stuList.length를 쓰면 안됨.
                    //학생부에 저장된 학생 수를 출력해야 하는데
                    //학생부의 크기를 출력하면 안 되기 때문이다
                    System.out.println((i+1) + "번 학생의 점수 : " + stuList[i] + "점");
                }
                System.out.println();
            }

            else if (action == 2) { // 1등 출력
                // 다른 학생들과 비교해서 가장 높은 점수를 출력
                // 오름차순으로 정렬하고 가장 뒤에 있는거를 뽑아내면 될 것 같음
                if(cnt<=0){
                    System.out.println("출력할 데이터가 없습니다");
                    continue;
                }
                int max=stuList[0];
                int maxIndex=0;
                for(int i=1; i<cnt; i++){
                    if(max<stuList[i]){
                        max=stuList[i];
                    }
                }
                System.out.println("1등은 " + (maxIndex + 1) + "번 학생, " + max + "점 입니다.");
//                for(int a=0; a<stuList.length-1; a++) {
//                    // Bubble sort
//                    for(int i=0;i<stuList.length-1;i++) { // 양옆 데이터끼리 비교하는 횟수
//                        if(stuList[i] > stuList[i+1]) {
//                            // 교환 알고리즘
//                            int tmp=stuList[i];
//                            stuList[i]=stuList[i+1];
//                            stuList[i+1]=tmp;
//                        }
//                    }
//                }
            }

            else if (action == 3) { // 정보추가
                if(cnt >= LEN) { //최대학생수만큼 저장된 상황이라면
                    System.out.println("학생부에 저장공간이 부족합니다.");
                    System.out.println("관리자에게 문의바랍니다.");
                    continue;
                }
                int score; //scope 이슈
                while(true) {
                    // 사용자로부터 학생의 점수를 입력
                    System.out.print("추가할 학생의 점수 입력 : ");
                    score = sc.nextInt();
                    if(score >=0 && score <= 100){
                        break;
                    }
                    System.out.println("0~100점 사이만 입가능합니다!");
                }
                // 입력받은 점수 정보를 배열에 저장
                stuList[cnt] = score;
                cnt++; //한 명 더 입력 받았기 때문에 카운트 증가
                // 저장완료! 안내
                System.out.println("학생 정보 추가 완료!");
            }

            else if (action == 4) { // 정보변경
                if(cnt <= 0){ // 학생부에 학생이 한명도 없다면
                    System.out.println("변경할 데이터가 없습니다");
                    continue;
                }

                // 정보변경할 학생의 번호를 입력받음

                int num; //scope 이슈
                while(true) { // 사용자로부터 입력을 받으면? 유효성 검사!
                    System.out.print("정보변경할 학생의 번호 입력 : ");
                    num = sc.nextInt();
                    if(num >= 1 && num <= cnt){ //입련 번호가 존재하는지 확인
                        break;
                    }
                    System.out.println("해당 번호의 학생은 존재하지 않습니다!");
                }
                // 어떤 점수로 변경할지 결정
                // 랜덤으로 변경
                int score;
                while(true) {
                    score = rand.nextInt(101); // 0~100 중 랜덤으로 돌림
                    if (score != stuList[num-1]){ // 점수가 이전과 다르면
                        break;
                    }
                }
                stuList[num-1]=score;
                // 정보 변경 완료 안내
                System.out.println("학생 정보 변경 완료!");
            }

            else { //유효성 검사
                System.out.println("잘못된 입력입니다! 다시 입력해주세요!");
            }
        }
    }
}

쇼핑몰 프로그램

package day006.shopping;

import java.util.Scanner;

/*[쇼핑몰 프로그램]

상품은 3개 고정, 이미 추가된 상태

1. 재고가 모두 출력됨.

    1번 상품 [2]개

    2번 상품 [3]개

    3번 상품 품절 << ☆

2. 상품을 선택

    3번 상품은 품절입니다.

    1번 상품을 구매하시겠습니까?

    1. 네  2. 아니오

    ⇒ 1번 상품 [1]개

3. 상품 재고 추가

    몇 번 상품 재고를 추가하시겠습니까? 3

    3번 상품 현재 재고 : 0개

    몇개 추가하시겠습니까? 5

    ⇒ 3번 상품 [5]개


자유롭게 코딩, CRUD 중에 무엇일지 주석으로 같이 작성*/
public class Test {
    public static void main(String[] args) {
        /* 스캐너 객체 생성
        *  인덱스를 상품번호라 생각하고 인덱스에 해당하는 재고를 저장
        *  배열[0]은 1개 배열[1]은 5개 배열[2]는 8개 이런식
        *  배열[1]은 사과 이런거라고 생각하면 될 것 같음
        *  그러면 배열 안에 [1, 5, 8] 이런식으로 저장되겠지
        *
        *  1. 재고를 전체 출력 - Read
        *  상품이 없을 때 유효성 검사를 통해 에러 출력
        *  재고가 있을 때 재고 전체를 출력
        *
        *  2. 상품 선택 - Read, Update
        *  재고 1번 => [?]개 이런식으로 전부 보여주고 몇번 선택할래? 물어보기
        *  0번 입력하면 뒤로 돌아가기 설정해주기
        *  1번 선택하면 1번 상품을 구매하시겠습니까? 출력
        *  1.네 2.아니오 에서 네 하면 1번 상품 [남아있는개수] 출력
        *  이상한거 선택한다고 하면 없다고 처리 후 다시 선택하게 하기
        *
        *  몇개 구매할지 물어보고 재고보다 적거나 같으면 구매하게 하고
        *  재고보다 많이 구매한다고 하면 재고는 [?]개 있습니다 다시 입력해주세요 처리
        *  아니오 선택하면 처음으로 돌아가게 하기
        *  이상한거 선택한다고 하면 없다고 처리 후 다시 선택하게 하기
        *  구매한 만큼 기존 재고에서 차감
        *
        *  3. 상품 재고 추가 - Update
        *  몇번 상품 재고를 추가하시겠습니까? 출력하고 몇개 입력받기
        *  0번 입력하면 뒤로 돌아가기 설정해주기
        *  상품 번호 잘못 입력하면 다시 입력받게 설정
        *  추가한다고 해놓고 -10 이런거 입력하면 안되니까 범위 설정
        *  추가했을 때 1조 개 1경 이렇게 써놓으면 에러나니까
        *  범위 설정하고 1만개 넘으면 양이 너무 많습니다. 관리자에게 문의해주세요
        *  [?]번 상품 현재 재고 : ?개 이렇게 출력하고
        *  몇개 추가하시겠습니까? 출력하고 몇개 입력받기
        *  현재 [?]번 상품 현재 재고 : ?개 출력해주기
        *
        *  4. 종료하기
        *  프로그램을 종료합니다 출력하고 종료시키기
        * */
        Scanner sc = new Scanner(System.in);

        int[] datas = new int[3]; //1. 티셔츠 2. 바지 3. 패딩
        datas[0] = 5; // 티셔츠
        datas[1] = 5; // 바지
        datas[2] = 5; // 패딩

        while(true){
            System.out.println("===== [쇼핑몰 프로그램] =====");
            System.out.println("1. 재고 전체 출력");
            System.out.println("2. 상품 구매");
            System.out.println("3. 상품 재고 추가");
            System.out.println("0. 종료하기");
            System.out.println("==========================");
            System.out.print("숫자를 입력해주세요 : ");
            int action = sc.nextInt();

            if(action == 0){ // 0. 종료하기
                System.out.println("프로그램을 종료합니다.");
                break;
            }

            else if (action == 1){ // 1. 재고 전체 출력
                System.out.println("=========================="); //재고 출력 분리
                if (datas == null) { // 상품이 없을 때
                    System.out.println("상품이 없습니다. 다시 입력해주세요");
                    break;
                } else if (datas != null){ // 상품이 있으면
                    for(int i=0; i<datas.length; i++){ //재고 출력
                        System.out.println((i+1) + "번 상품 [" + datas[i] + "]개");
                    }
                    System.out.println("=========================="); //재고 출력 분리
                    System.out.println(); //줄바꿈
                }
            }

            // 2. 상품 구매
            else if (action == 2) {
                while(true) {  // 구매 메뉴를 위한 반복문 추가
                    System.out.println("=== 재고 목록 ===");
                    for(int i=0; i<datas.length; i++){ //재고 출력
                        System.out.println((i+1) + "번 상품 [" + datas[i] + "]개");
                    }
                    System.out.println();
                    System.out.println("몇 번을 구매하시겠습니까? (0: 이전 메뉴)");
                    System.out.print(">>");

                    int res = sc.nextInt(); // 몇 번 재고를 구매할지 입력받기

                    // 0 입력시 이전 메뉴로
                    if(res == 0) {
                        System.out.println("이전 메뉴로 돌아갑니다.");
                        break;
                    }

                    //유효한 번호 외에 다른거 입력했을 때 예외처리
                    if(res < 1 || res > 3){
                        System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
                        continue;  // 상품 번호 입력으로 다시 돌아감
                    }

                    while(true) { //선택한 재고 불러옴
                        System.out.println(res + "번 상품을 구매하시겠습니까?\n1.네 2.아니오");
                        System.out.print("숫자를 입력해주세요 >> ");
                        int answer = sc.nextInt(); //몇개 구매할지 입력받음

                        if (answer == 2) { //아니오 누르면 다시 처음으로 돌아가게 함
                            break;  // 구매 취소시 상품 선택으로 돌아감
                        } else if (answer == 1) { //네 눌렀을 때
                            System.out.print("몇개를 구매하시겠습니까?\n >> ");
                            int quantity = sc.nextInt();

                            //인덱스는 0부터 시작하므로 선택한 수에서 1을 뺀다
                            int index = res - 1;

                            if (quantity > datas[index] || quantity < 0) {
                                System.out.println("재고가 부족합니다. 다시 입력해주세요");
                                continue; //가독성 향상
                            } else if (quantity == 0) {
                                System.out.println("0개는 구매가 안 된 상태입니다. 다시 입력해주세요.");
                                continue; //가독성 향상
                            } else if (quantity <= datas[index]) {
                                datas[index] = datas[index] - quantity; // 실제 재고 차감
                                System.out.println(quantity + "개 구매완료.");
                                System.out.println("현재 " + res + "번 상품의 재고는 [" + datas[index] + "] 개 있습니다.");
                                break;  // 반복문 탈출
                            }

                        } else {
                            System.out.println("숫자를 잘못 입력하셨습니다. 다시 입력해주세요");
                            continue; //가독성 향상
                        }
                    }
                    break; //반복문 탈출해서 메인 메뉴로 돌아가기
                }
            }


            // 3. 상품 재고 추가
            else if (action == 3) {
                while(true) {
                    System.out.println("=== 상품 재고 ===");
                    // 현재 재고 상태 출력
                    for(int i = 0; i < datas.length; i++) {
                        System.out.println((i+1) + "번 재고 : " + datas[i] + "개");
                    }

                    System.out.print("몇 번 상품의 재고를 추가하시겠습니까? (0: 이전 메뉴)\n>> ");
                    int res = sc.nextInt();

                    // 이전 메뉴로 돌아가기
                    if(res == 0) {
                        break;
                    }

                    // 1번보다 작을 때, 3번보다 클 때 유효성 검사
                    if(res < 1 || res > 3) {
                        System.out.println("해당 번호는 없는 번호입니다. 다시 입력해주세요");
                        continue;
                    }

                    // 재고 몇개 추가할지 검사
                    System.out.print(res + "번 상품에 몇개의 재고를 추가할까요?\n>> ");
                    int quantity = sc.nextInt();

                    // 수량 유효성 검사
                    if(quantity < 0) { // 0보다 작을 때
                        System.out.println("음수는 입력할 수 없습니다. 다시 입력해주세요");
                        continue;
                    } else if(quantity == 0) { // 0을 입력했을 때
                        System.out.println("0은 추가되지 않습니다. 다시 입력해주세요");
                        continue;
                    } else if(quantity >= 100) { // 100보다 크거나 같을 때
                        System.out.println("창고가 모자랍니다. 관리자에게 문의해주세요");
                        continue;
                    }

                    // 재고 추가 및 결과 출력
                    datas[res - 1] += quantity; //-1을 해야 우리가 생각한 값이 나옴 인덱스는 0부터 시작
                    System.out.println(res + "번 상품의 현재 재고는 [" + datas[res - 1] + "]개 입니다.");
                    break; //반복문 탈출
                }
            }

            else { //없는 번호 눌렀을 때 유효성 검사
                System.out.println("잘못된 입력입니다! 다시 입력해주세요!");
            }
        }
    }
}

 

https://youtu.be/4-YPm5BUXR4