IT/JAVA

쇼핑몰 프로그램 구현

_KH_ 2025. 1. 3. 20:18

오늘은 쇼핑몰 프로그램을 구현해보았다.

 

[문제]

// 쇼핑몰 프로그램
		// 상품은 3개 고정. 
		/*1. 재고를 모두 출력 (ex. 1번 상품 [2]개, 2번 상품 [3]개, 3번 상품 품절 -> R (getall)
		 *만약 재고가 없으면 품절이라고 출력
		 *2. 상품을 선택  + (구매여부) -> R, U (getone)
		 *		사용자의 입력을 받아서 품절이면, 3번 상품은 품절입니다.
		 *			재고가 있으면, 1번 상품을 구매하시겠습니까? 물어봄 
		 			1. 네 , 2. 아니오
		 			=====> 구매시 재고 1번 상품 [1]개로 줄어들도록
		 * 3. 상품 재고 추가 -> U
		 * 		몇번 상품 재고를 추가하시겠습니까? 3 
		 * 		3번 상품 현재 재고 출력 : 0	
		 * 		몇개 추가 하시겠습니까 ? : 3
		 * 		====> 3번 상품 [3]개 
		 * 
		 * ※ 나와있지 않은 상황에 대해서는 자유롭게 코딩
		 * ※ 작성한 기능은 CRUD 중 무엇일지 작성
		 * */

재고를 출력하는 기능은 저장되어 있는 정보를 출력하기만 하므로 Read

상품을 선택하고 구매하는 기능은 저장되어 있는 정보를 출력하고 상품의 개수를 줄이므로 Read & Update

상품 재고를 추가하는 기능은 위와 마찬가지로 상품의 개수를 증가시키므로(=데이터를 건드는 영역이기에) Update

 

프로그램을 작성하기 전 CRUD를 생각해보면 어떻게 코드를 작성해야할지 방향 잡기가 더욱 수월하다.

 

[한글 코딩]

	/*==========================1. 재고 출력 =============================
		 * 상품은 동일한 자료형이므로 배열에 저장. 
		 * 상품의 최대 개수는 3개이므로 배열의 길이를 상수로 선언
		 * 상품을 저장할 배열 선언. 배열[] = 상수;
		 * 상품별 최대 개수는 10개로 선언
		 * 각 인덱스별로 재고 넣는 코드 작성
		 * 
		 * 사용자에게 어떤 기능을 선택할건지 물어보는 선택지 출력
		 * 사용자의 입력을 받을거니까 스캐너 필요함
		 * 몇 번까지만 입력 가능한지 사용자에게 알려주면 좋음
		 * 올바른 선택을 할 때까지 무한반복
		 * 무한반복 {
		 * 		=============쇼핑몰============
		 * 		1. 재고 출력
		 * 		2. 상품 구매
		 * 		3. 재고 추가
		 * 		0. 프로그램 종료 // 만약 0번을 누르면 프로그램을 종료하도록 함. 반복문의 종료조건으로 작성
		 * 		=============================
		 * 만약 올바르지 않은 번호를 입력하면 오류 메시지를 출력하고 다시 되돌아가 번호를 입력하도록 함. 선택 가능한 번호의 범위는 3번까지
		 * 만약(0 미만이거나 3 초과하는 숫자를 입력한다면)
		 * { 올바르지 않은 번호입니다! 0번부터 3번까지만 선택 가능합니다! 출력}
		 * 
		 * 무한반복 {
		 * 	만약(사용자가 0번을 누르면) {
		 * 		프로그램을 종료합니다. 문구 출력 후 프로그램 종료 (반복문을 나감)
		 * 
		 * } 만약 (사용자가 1번을 누르면) {
		 * 		재고를 출력한다.
		 * 		1번 상품 [2]개
		 * 		2번 상품 [10]개
		 * 		3번 상품 품절
		 * 		* 만약 재고가 없을 시 "품절" 출력
		 * 		재고 출력 후 초기화면으로 되돌아가기
		 *	}
		 *
		 *==========================2. 상품 구매=============================
		 *	만약 (사용자가 2번을 누르면) { 
		 *		올바른 입력이 들어올 때까지 반복해야 하니까 무한반복할건데 종료조건으로는 5를 입력했을 때로 설정 
		 		(갑자기 구매하고 싶지 않아졌을 때)
		 		
		 		만약 (모든 인덱스 내 상품의 갯수가 0이라면) {
		 			모든 상품이 품절되었습니다.
		 			다음기회에 이용해주세요. 
		 			출력하고 초기화면으로 이동
		 			}
		 		
		 *		몇번 상품을 선택하시겠습니까 ? 문구 출력 (0번 입력 시 해당 메뉴를 종료한다는 문구 같이 출력하기)
		 *		사용자 입력 받기 - 1입력
		 *		
		 *		만약 (0번 미만 3번 초과하는 번호를 입력 시) 
		 *			{ 해당 상품은 존재하지 않습니다! 1번-3번 사이로 입력해주세요! 출력) }
		 *		
		 *		만약(재고가 없는 상품 번호를 입력하면( {
		 *			해당 상품은 품절입니다 ! 다른 상품을 선택해주세요 문구 출력
		 *			상품 선택으로 다시 되돌아가기 
		 *		}	
		 *
		 *		1번 상품을 구매하시겠습니까 ? - 1. 네, 2. 아니오 문구 출력
		 *
		 *		만약 (사용자가 1번이나 2번 외 다른 번호를 입력하면) {
		 *		숫자는 1과 2만 입력 가능합니다! 출력 }
		 *
		 *		 만약 (1번 선택시) {
		 *			구매 완료 되었습니다.
		 *			1번 상품 개수 감소 -1 }
		 *			(2번 선택 시) {
		 *				선택 취소되었습니다.
		 *			하고 초기 화면으로 다시 되돌아가기
		 *			}
		 *		}
		 **		만약 (숫자 5를 입력하면) {
		 			해당 메뉴를 종료합니다. 출력 후 초기 화면으로 되돌아가기 
		 			}
		 		}
		 *
		 *==========================3. 재고 추가 =============================
		 *	만약(사용자가 3번을 누르면) { (여기도 5 누르면 무한루프 탈출하고 초기화면으로 돌아가도록 ㄱㄱ)
		 *		몇번 상품의 재고를 추가하시겠습니까? 문구 출력
		 *		사용자 입력 받기 : 1 입력
		 *		만약(0 미만이거나 3 초과하는 숫자를 입력하면) {
		 *			유효한 범위를 입력해주세요! 출력하고 번호 선택으로 되돌아가기
		 *		}
		 *
		 *		유효한 범위를 입력받을 때까지 출력해야하므로 무한루프 사용,
		 *		종료조건 : 만약(0이상 3 이하의 번호를 입력하면) 반복문을 빠져나간다.
		 *		
		 *		1번 상품의 재고 출력 : 1
		 *		몇개 추가하시겠습니까? 문구 출력
		 *		사용자 입력받기 : 7
		 *
		 *		만약 (이미 10개가 담겨있으면) {
		 *			최대 수량을 초과하였습니다! 추가가 불가능합니다! 출력하고 
		 *			초기화면으로 되돌아가기
		 *		}
		 *
		 *		사용자가 입력한 숫자를 상품의 개수에 더하기
		 *		
		 *		만약 (사용자 입력 숫자 + 현재 해당 상품의 개수가 10보다 클 때) { 
		 *				현재 n개 담겨있습니다! 상품 최대 개수는 10개입니다!경고 메시지 띄우기
		 *				몇개 추가할건지 묻는 문구로 다시 되돌아감
		 *			}
		 *    // + ) 최대 개수인 10개까지만 채워주고 나머지는 추가안했다고 알려줘도 ㄱㅊㄱㅊ
		 *
		 *		만약 (사용자가 0을 입력하면) {
		 *				상품을 추가하지 않았습니다. 초기화면으로 되돌아갑니다.
		 *				출력 후 초기화면으로 되돌아가기
		 *		}
		 *
		 *		상품의 현재 재고 출력 (1번 상품의 재고 : 8)
		 *		재고 추가되었습니다! 문구 출력
		 *		초기 화면으로 되돌아가기
		 *
		 *

 

한글 코딩은 최대한 상세하게! 그래야 코드 작성하기 수월하다.

한글 코딩을 자세히 해놓으면 코드 작성 시 한글 코딩만 보고 쭉 따라서 코드로 작성하면 되기 때문.

 

[내가 작성한 코드]

package shopping;

import java.util.Scanner;

public class Test2 {

	public static void main(String[] args) {

		int[] proList = new int[3];
		int cnt = 10;
		proList[0] = 1;
		proList[1] = 2;
		proList[2] = 3;
		// 갯수 0개 미만으로 내려가지 않도록 설정 ㄱㄱ

		/*for(int i = 0; i < 3; i++) {
			if(proList[i] < 0 || proList[i] > 10) {
				System.out.println("상품을 더 담거나 뺄 수 없습니다!");
			}
		}*/

		Scanner sc = new Scanner(System.in);

		/*	if(product[] == 0) {
			System.out.println("상품이 존재하지 않습니다..");
			return; // 모든 번호에 필요한 기능이니까 가장 상단에 작성하면 좋을듯
		} */

		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.println("번호를 선택해주세요! (0-3번 중 선택) >>");
			int action = sc.nextInt(); 



			if(action == 0) {
				System.out.println("프로그램을 종료합니다.");
				break;
			} else if (action == 1) { // 재고 출력
				for(int i= 0; i<proList.length; i++) { // 배열 길이 i<3 대신 proList.length 사용 ㄱㄱ
					if(proList[i]<= 0) { // <=로 수정 ㄱㄱ
						System.out.println((i+1) + "번 상품 품절");
					} else {
						System.out.println((i+1) + "번 상품 [" + proList[i] + "]개");
					}
				}
			} else if (action == 2) { // 상품 선택
				while(true) {
					if(proList[0] == 0 && proList[1] == 0 && proList[2] == 0) {
						System.out.println("모든 상품이 품절되었습니다. 다음 기회에 이용해주세요.");
						break;
					}
					System.out.println("몇 번 상품을 선택하시겠습니까?(5번 선택 시 초기화면으로 되돌아갑니다.) >>");
					action = sc.nextInt();

					if(action == 5) {
						System.out.println("해당 메뉴를 종료합니다.");
						break;
					}

					if(action <= 0 || action > 3) { 
						System.out.println("해당 상품은 존재하지 않습니다! 유효한 번호를 입력해주세요.");
						continue;
					}	
					if(proList[action-1] == 0) {
						System.out.println("해당 상품은 품절입니다! 다른 상품을 선택해주세요.");
						continue;
					}	
					System.out.println((action) + "번 상품을 구매하시겠습니까?");
					System.out.println("1. 네  2. 아니오 >>");
					//action =sc.nextInt();
					int buy = sc.nextInt();
					if(buy < 0 || buy > 2) {
						System.out.println("숫자는 1과 2만 입력 가능합니다!");
						continue;
					}
					if(buy == 1) {
						if(proList[action-1] > 0) {
							proList[action-1] -= 1;
							System.out.println("구매 완료되었습니다.");
							break;
						} else {
							System.out.println("해당 상품은 품절입니다. 다른 상품을 선택해주세요.");
						}
					} // 1번을 샀는데 왜 2번이 줄어드냐고
					else {
						System.out.println("선택 취소되었습니다.");
						break;
					} 

				}
			} else if (action == 3) { // 재고 추가
				while(true) {
					System.out.println("몇 번 상품의 재고를 추가하시겠습니까? (5번 선택 시 초기화면으로 되돌아갑니다.)");
					action = sc.nextInt();
					if(action == 5) {
						System.out.println("해당 메뉴를 종료합니다.");
						break;
					}
					if(action < 0 || action > 3) {
						System.out.println("유효한 범위를 입력해주세요!");
						continue;
					}
					System.out.println((action) + "번 상품 [" + proList[action-1] + "]개");

					if(proList[action-1] == 10) {
						System.out.println("최대 수량을 초과하였습니다! 추가가 불가능합니다!");
						break;
					}

					System.out.println("몇 개 추가하시겠습니까? (재고 최대 개수 : 10)");
					int add = sc.nextInt(); // 입력을 2번 받아서 추가하는 변수 따로 선언

					if(add > 10) {
						System.out.println("현재 " + proList[action-1] + "개 담겨있습니다! 재고 최대 개수는 10개입니다!");
						continue;
					}
					else if(proList[action-1] + add > 10) {
						System.out.println("현재 " + proList[action-1] + "개 담겨있습니다! 재고 최대 개수는 10개입니다!");
						continue; 
					}
					else if(add == 0) {
						System.out.println("재고를 추가하지 않았습니다. 초기화면으로 되돌아갑니다.");
						break;
					} else {
						proList[action-1] += add;
						System.out.println("재고 추가 되었습니다!");
						break;
					}
				}	
			} else { // 유저가 잘못 누름
				System.out.println("잘못된 입력입니다. 다시 입력해주세요!");
			}
		}
	}
}

 

재고 추가 당시 사용자 입력 변수가 중복되어서 자꾸 1번 상품을 사도 2번 상품의 개수가 줄어드는 일이 발생했다.

이 오류 때문에 한참을 헤맸는데.. 입력받는 변수를 따로 두어서 해결했다 ^^!

앞으로는 제대로 잘 나누도록.....

그리고 if문을 너무 남발해서 사용해서 가독성이 안좋은데 이 또한 고쳐야겠다.

 

[강사님 코드]

	Scanner sc=new Scanner(System.in);

		int[] proList=new int[3];
		proList[0]=2;
		proList[1]=3;
		proList[2]=0;

		while(true) {
			System.out.println();
			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) {
				break;
			}
			else if(action==1) { // 전체 출력 : R
				for(int i=0;i<proList.length;i++) {
					if(proList[i]>0) {
						System.out.println((i+1)+"번상품 "+proList[i]+"개");
					}
					else {
						System.out.println((i+1)+"번상품 품절");
					}
				}
			}
			else if(action==2) { // 상품 구매
				// 상품 선택 : R
				int num; // scope 이슈 해결
				while(true) {
					System.out.print("상품번호 입력 >> ");
					num=sc.nextInt();
					if(1<=num && num<=proList.length) {
						break;
					}
					System.out.println("올바른 번호로 다시 입력해주세요!");
				}
				// 상품의 상태 출력
				if(proList[num-1]>0) {
					System.out.println((num)+"번상품 "+proList[num-1]+"개");
				}
				else {
					System.out.println((num)+"번상품 품절");
					System.out.println("구매불가능합니다...");
					continue;
				}

				// 구매 : U
				proList[num-1]--;
				System.out.println("상품 구매 완료!");
			}
			else if(action==3) { // 재고 추가 : U
				// 상품 선택 : R
				int num; // scope 이슈 해결
				while(true) {
					System.out.print("상품번호 입력 >> ");
					num=sc.nextInt();
					if(1<=num && num<=proList.length) {
						break;
					}
					System.out.println("올바른 번호로 다시 입력해주세요!");
				}
				// 상품의 상태 출력
				if(proList[num-1]>0) {
					System.out.println((num)+"번상품 "+proList[num-1]+"개");
				}
				else {
					System.out.println((num)+"번상품 품절");
				}

				int cnt; // scope 이슈 해결
				while(true) {
					System.out.print("추가할 상품의 개수 입력 >> ");
					cnt=sc.nextInt();
					if(cnt>0) {
						break;
					}
					System.out.println("정확한 재고를 입력해주세요!");
				}
				proList[num-1]+=cnt; // 누적 ☆
				System.out.println("재고 추가 완료!");
			}
			else {
				System.out.println("유효성 검사");
			}
		}

'IT > JAVA' 카테고리의 다른 글

Java Section 04 : 제어문-1  (0) 2025.01.05
Java Section 03 : 연산자  (0) 2025.01.04
Java Section 02 : 변수와 자료형  (0) 2025.01.03
Java Section 01 : 자바 프로그래밍의 기본  (2) 2025.01.02
Day 5 - 배열 문제 풀이  (0) 2025.01.02