오늘은 쇼핑몰 프로그램을 구현해보았다.
[문제]
// 쇼핑몰 프로그램
// 상품은 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 |