프로그래밍

[자바 기초] day11 : 추상화/ 캡슐화 예제 본문

자바/자바 기초

[자바 기초] day11 : 추상화/ 캡슐화 예제

시케 2023. 5. 18. 17:40
728x90
반응형

[ 연습문제 ]

 

class Player
   최대 3마리의 포켓몬을 소유할수있다.
   Player 생성시 최초 소지 포켓몬은 무조건 피카츄이다.
   final static int maxIndex=3;
   int preIndex; // 1
   Pokemon[] data; // new Pokemon[maxIndex]
   // data[0]=new 피카츄();
   void play()
      // data에 저장된 포켓몬을 랜덤으로 2마리 선택하여 게임을 진행
      // 단, 2마리의 포켓몬이 서로 같은 포켓몬이면 더이상 진행하지않음 [Object최상위클래스->equals() 오버라이딩]
               클래스 타입이 같으면 같은 포켓몬
      // 서로 다른 포켓몬이면 포켓몬.game()을 진행함
      // 이긴 포켓몬의 울음소리가 console에 출력됨
      // 포켓몬.hello()

class Pokemon [abstract]
   String name;
   int win; // 이긴횟수
   void hello() // 울음소리. 하위클래스에 따라 수행되는 기능이 다름에 유의 [오버라이딩 강제->추상메서드]
   boolean game(Pokemon pokemon)
      // win이 홀홀일때는 작은쪽이 이김
      // win이 짝짝일때는 큰쪽이 이김
      // win이 홀짝일때는 홀수가 이김
      // win이 동일하다면 주어(주체)가 이김
      // 이후 이긴쪽의 win이 1 증가

package class01;

import java.util.ArrayList;
import java.util.Scanner;

class Product {
   Scanner sc = new Scanner(System.in);

   private int num; // 상품 PK
   private String name; // 상품명
   private int price; // 상품 가격
   private int cnt; // 상품 재고

   public int getNum() {
      return num;
   }

   public void setNum(int num) {
      this.num = num;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public int getPrice() {
      return price;
   }

   public void setPrice(int price) {
      this.price = price;
   }

   public int getCnt() {
      return cnt;
   }

   public void setCnt(int cnt) {
      this.cnt = cnt;
   }

   // 생성자 이름, 가격을 사용자가 입력
   Product(int num, String name, int price) {
      this(num, name, price, 0);
   }

   // 생성자 이름, 가격, 재고를 사용자가 입력
   Product(int num, String name, int price, int cnt) {
      this.num = num;
      this.name = name;
      this.price = price;
      this.cnt = cnt;
   }

   // 구매 메서드
   boolean sell(int cnt) {

      if (this.cnt >= cnt) {
         System.out.println("가격은 " + (this.price * cnt) + "원 입니다");
         System.out.println("돈을 입력해주세요");
         System.out.println("입력: ");

         while (true) {
            int money = sc.nextInt();
            if (money >= (this.price * cnt)) {
               System.out.println("잔돈: " + (money - (this.price * cnt)));
               this.cnt -= cnt;
               System.out.println("구매완료");
               break;
               
            } else {
               System.out.println("다시 입력해주세요");
            }   
         }
         return true;
      // 재고가 부족할시
      } else {
         System.out.println("재고가 부족합니다");
         return false;
      }
   }

   @Override
   public String toString() { // toString 오버라이딩

      if (this.cnt <= 0) {
         return this.num + ". " + this.name + " 가격: " + this.price + "원 재고: " + "[품절]";
      }

      return this.num + ". " + this.name + " 가격: " + this.price + "원 재고: " + this.cnt + "개";
   }

}

public class Test01 {

   public static void main(String[] args) {

      Scanner sc = new Scanner(System.in);
      ArrayList<Product> data = new ArrayList<Product>();
      int numPK = 1001; // 1001번부터 순서대로 부여

      // 유저 선택창
      String userMsg = "1. 상품목록출력\n" + "2. 구매하기\n" + "3. 프로그램종료\n";

      // 관리자 선택창
      String managerMsg = "1. 상품추가\n" + "2. 상품재고변경\n" + "3. 상품삭제\n" + "4. 관리자모드종료\n";

      while (true) { // 종료할때까지 반복

         System.out.println(userMsg);
         System.out.print("입력: ");
         int action = sc.nextInt(); // 사용자의 행동을 입력받을 변수

         if (action == 1) {
            System.out.println("1. 상품목록출력");
            for (Product product : data) {
               System.out.println(product);
            }

         }
         // 상품 번호와 구매수량을 입력 받아 구매
         else if (action == 2) {
            System.out.println("2. 구매하기");
            System.out.println("구매하실 상품 번호를 입력해주세요");
            System.out.print("입력: ");
            int num = sc.nextInt();

            System.out.println("얼마나 구매하시겠습니까?");
            System.out.print("입력: ");
            int cnt = sc.nextInt();

            // 입력받은 수와 PK가 같으면 구매 메서드 실행
            for (int i = 0; i < data.size(); i++) {
               if (num == data.get(i).getNum()) {
                  data.get(i).sell(cnt);
               }

            }

         } else if (action == 3) { // break로 프로그램 종료
            System.out.println("프로그램을 종료합니다...");
            break;
         } else if (action == 1234) { // 관리자 모드 진입

            while (true) { // 관리자 모드 종료을 선택하지 않으면 반복

               System.out.println("관리자 모드 비밀번호를 입력해주세요");
               System.out.print("입력: ");
               action = sc.nextInt();

               if (action != 5678) {
                  System.out.println("비밀번호가 일치하지 않습니다");
                  continue;
               }

               System.out.println(managerMsg);
               System.out.print("입력: ");
               action = sc.nextInt();

               for (Product product : data) {
                  System.out.println(product);
               }

               // 상품 추가 PK는 자동입력
               if (action == 1) {
                  System.out.println("1. 상품추가");
                  System.out.println("추가하실 상품 이름을 입력해주세요");
                  System.out.print("입력: ");
                  String name = sc.next();

                  System.out.println("해당 상품의 가격을 입력해주세요");
                  System.out.print("입력: ");
                  int price = sc.nextInt();

                  System.out.println("재고도 입력하시겠습니까?");
                  System.out.println("1. 재고 입력 없음 2. 재고 입력");
                  action = sc.nextInt();

                  if (action == 1) { // 재고 입력 안할 시 재고: 0

                     data.add(new Product(numPK++, name, price));
                     System.out.println(data);
                  } else if (action == 2) { // 사용자가 입력한 값으로 등록
                     System.out.println("해당 상품의 재고를 입력해주세요");
                     System.out.print("입력: ");
                     int cnt = sc.nextInt();

                     data.add(new Product(numPK++, name, price, cnt));
                     System.out.println("추가되었습니다");
                  }

               }
               // 사용자
               else if (action == 2) {
                  System.out.println("2. 상품재고변경");
                  System.out.println("재고를 변경하실 상품의 번호를 입력해주세요");
                  System.out.print("입력: ");
                  int num = sc.nextInt();

                  System.out.println("재고를 몇으로 변경하시겠습니까?");
                  System.out.println("입력: ");
                  int cnt = sc.nextInt();

                  for (int i = 0; i < data.size(); i++) {
                     if (num == data.get(i).getNum()) {
                        data.get(i).setCnt(cnt);
                        System.out.println("변경되었습니다");
                        break;
                     }
                  }

               } else if (action == 3) {
                  System.out.println("3. 상품삭제");
                  System.out.println("삭제하실 상품의 번호를 입력해주세요");
                  System.out.print("입력: ");
                  int num = sc.nextInt();

                  for (int i = 0; i < data.size(); i++) {
                     if (num == data.get(i).getNum()) {
                        data.remove(i);
                        System.out.println("삭제되었습니다");
                        break;
                     }
                  }

               } else if (action == 4) {
                  System.out.println("4. 관리자모드종료");
                  System.out.println("관리자 모드를 종료합니다...");
                  break;
               }

            }

         }

      }
   }

}
728x90
반응형
Comments