Full-Stack 개발자가 되려는 작은 개발자의 블로그
물품 관리 프로그램(Homeminus) 본문
Data Transfer Object
- Product > 가장 상위 분류
package com.homeminus.dto;
public class Product {
private String name; //제품명
private int price; //가격
private int amount; //수량
private String made; //원산지
private String mDay; //제조일자
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 getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public String getMade() {
return made;
}
public void setMade(String made) {
this.made = made;
}
public String getmDay() {
return mDay;
}
public void setmDay(String mDay) {
this.mDay = mDay;
}
public String toString() {
//제품 클랫의 필드들 출력하도록 작성
String str="=========================\n"
+ "제품명 : "+this.name+"\n"
+ "가격 : "+this.price+"\n"
+ "수량 : "+this.amount+"\n"
+ "국가 : "+this.made+"\n"
+ "일자 : "+this.mDay+"\n";
return str;
}
}
- ElectProduct
package com.homeminus.dto;
public class ElectProduct extends Product {
private String maker; //제조사
private int guarantee; //품질 보증 기간
private int grade; // 효율 등급 1~5
public String getMaker() {
return maker;
}
public void setMaker(String maker) {
this.maker = maker;
}
public int getGuarantee() {
return guarantee;
}
public void setGuarantee(int guarantee) {
this.guarantee = guarantee;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
@Override
public String toString() {
String str="제조사 : "+this.maker+"\n"
+"보증기간 : "+this.guarantee+"\n"
+"등급 : "+this.grade+"\n";
return super.toString()+str;
}
}
- LifeProduct
package com.homeminus.dto;
public class LifeProduct extends Product{
private String maker; //제조사
private String usage; //용도
private boolean recycle; //재활용여부
public String getMaker() {
return maker;
}
public void setMaker(String maker) {
this.maker = maker;
}
public String getUsage() {
return usage;
}
public void setUsage(String usage) {
this.usage = usage;
}
public boolean isRecycle() {
return recycle;
}
public void setRecycle(boolean recycle) {
this.recycle = recycle;
}
@Override
public String toString() {
String rec;
if(this.recycle) {
rec="가능";
}else {
rec="불가능";
}
//조건 연산
//rec=(recycle)?"가능":"불가능";
String str="제조사 : "+this.maker+"\n"
+"용도 : "+this.usage+"\n"
+"재활용여부 : "+rec+"\n";
return super.toString()+str;
}
}
- ElectProduct
package com.homeminus.dto;
public class FoodProduct extends Product{
private String origin;//생산지
private String period; //유통기한
private String kind; //종류
public String getOrigin() {
return origin;
}
public void setOrigin(String origin) {
this.origin = origin;
}
public String getPeriod() {
return period;
}
public void setPeriod(String period) {
this.period = period;
}
public String getKind() {
return kind;
}
public void setKind(String kind) {
this.kind = kind;
}
@Override
public String toString() {
String str="생산지 : "+this.origin+"\n"
+"유통기한 : "+this.period+"\n"
+"종류 : "+this.kind+"\n";
return super.toString()+str;
}
}
Controller
- mainController
package com.homeminus.controller;
import java.awt.event.FocusEvent;
import java.util.*;
import com.homeminus.dto.ElectProduct;
import com.homeminus.dto.FoodProduct;
import com.homeminus.dto.LifeProduct;
import com.homeminus.dto.Product;
import com.homeminus.service.ProductService;
import com.homeminus.view.ProductView;
public class MainController {
//서비스, 뷰(화면 처리)용 인스턴스 생성
ProductView pv=new ProductView();
ProductService ps = new ProductService();
public void control() {
//더미 데이터 추가(모든 프로그램이 작성이 완료되면 삭제)
ps.startPs();
//메뉴 입력용 변수
int menu=0;
//프로그램 무한 반복
while(true) {
//타이틀과 메뉴 출력하는 메소드 호출
pv.showMainMenu();
//메뉴 번호 입력 받는 메소드 호출
menu=pv.inputMenu();
//종료 처리
if(menu==0) {
pv.alertMessage(0);
break;
}
//메뉴 분기 처리
switch(menu) {
case 1: //제품 등록
regProduct();
break;
case 2: //제품 출력
prtProduct();
break;
case 3: //제품 검색
break;
case 4: //제품 수정
break;
case 5: //제품 삭제
break;
default:
pv.alertMessage(2);
break;
}
}
}
//제품 등록용 메소드
private void regProduct() {
Product product=null;
int menu=0;
boolean result;
//돌아가기 메뉴가 선택되기 전까지 무한반복
while(true) {
pv.showSubMenu("제품 등록", 1);
menu=pv.inputMenu();
if(menu==0) {
pv.alertMessage(1);
break;
}
switch(menu) {
case 1: //가전제품 등록
product=new ElectProduct();
break;
case 2: //생필품 등록
product=new LifeProduct();
break;
case 3: //식품 등록
product=new FoodProduct();
break;
default :
pv.alertMessage(2);
break;
}
//View 클래스에서 데이터 입력
pv.inputProduct(product);
//Service 클래스에서 데이터 저장
result=ps.registProd(product);
if(result) {
pv.alertMessage(4);
}else {
pv.alertMessage(7);
}
}
}
private void regElectProduct() {
}
//제품 출력 메소드
/*
* 2가지 출력 형태
* - 전체 출력
* - 카테고리별 출력
*/
private void prtProduct() {
int menu=0;
//저장된 목록에 제품이 들어있는지 확인
//서비스 클래스로부터 제품 목록을 받아와서 확인
ArrayList<Product> pList = ps.getProductList();
if(pList.isEmpty()) { //isEmpty() > ArrayList에 저장된 데이터가 없으면 true
//View 클래스의 메시지 출력
pv.alertMessage(3);
return;
}
while(true) {
//서브메뉴 출력
pv.showSubMenu("제품 출력", 2);
//메뉴 받기
menu=pv.inputMenu();
if(menu==0) {
pv.alertMessage(1);
break;
}
switch (menu) {
case 1: //전체 출력
//전체 목록을 View클래스의 출력 메소드로 전달
pv.printProduct(pList, 0);
break;
case 2: //카테고리별 출력 > 카테고리 서브메뉴
prtCategoryProduct(pList);
break;
default:
pv.alertMessage(2);
break;
}
}
}
private void prtCategoryProduct(ArrayList<Product> pList) {
int menu=0;
while(true) {
//서브메뉴 출력
pv.showSubMenu("카테고리별 출력", 1);
//메뉴 받기
menu=pv.inputMenu();
if(menu==0) {
pv.alertMessage(1);
break;
}
//뷰 클래스의 카테고리별 출력 메소드 사용
//카테고리 선택 번호(서브메뉴번호)를 출력 메소드에 전달
pv.printProduct(pList, menu);
}
}
//제품 검색용 메소드(전체 검색)
private void selectProduct() {
//저장된 목록에 제품이 들어있는지 확인
//서비스 클래스로부터 제품 목록을 받아와서 확인
ArrayList<Product> pList = ps.getProductList();
if(pList.isEmpty()) { //isEmpty() > ArrayList에 저장된 데이터가 없으면 true
//View 클래스의 메시지 출력
pv.alertMessage(3);
return;
}
}
//제품 수정용 메소드 (이름으로 검색)
private void modifyProduct() {
}
//제품 삭제용 메소드(1.전체 2.검색)
private void deleteProduct() {
//저장된 목록에 제품이 들어있는지 확인
//서비스 클래스로부터 제품 목록을 받아와서 확인
ArrayList<Product> pList = ps.getProductList();
if(pList.isEmpty()) { //isEmpty() > ArrayList에 저장된 데이터가 없으면 true
//View 클래스의 메시지 출력
pv.alertMessage(3);
return;
}
int menu;
while(true) {
menu = pv.inputMenu();
if(menu==0) {
pv.alertMessage(1);
break;
}
switch(menu) {
case 1:
break;
case 2:
break;
default :
pv.alertMessage(2);
break;
}
}
}
}
View
- ProductView
package com.homeminus.view;
import java.util.ArrayList;
import java.util.Scanner;
import com.homeminus.dto.ElectProduct;
import com.homeminus.dto.FoodProduct;
import com.homeminus.dto.LifeProduct;
import com.homeminus.dto.Product;
//입력, 출력 작업은 모두 이 클래스에서 처리
public class ProductView {
Scanner scan=new Scanner(System.in);
//////////////////////////////////////////////출력 처리
public void alertMessage(int menu) {
switch(menu) {
case 0 : //프로그램 종료
System.out.println("프로그램을 종료합니다.");
break;
case 1 : //이전 메뉴
System.out.println("이전 메뉴로 돌아갑니다.");
break;
case 2 : //메뉴 입력 오류
System.out.println("메뉴 입력 오류 발생! 다시 입력해주세요.");
break;
case 3 : //데이터 없음
System.out.println("등록 된 상품이 없습니다.");
break;
case 4 : //저장 완료
System.out.println("상품 등록이 완료되었습니다.");
break;
case 5 : //삭제 완료
System.out.println("상품 삭제가 완료되었습니다.");
break;
case 6 : //검색 결과 없음
System.out.println("검색 된 상품이 없습니다.");
break;
case 7 : //저장 실패
System.out.println("상품 등록의 실패하였습니다.");
break;
case 8 : //삭제 실패
System.out.println("상품이 삭제되지 않았습니다.");
break;
}
}
//타이틀 및 메인 메뉴를 출력하는 메소드
public void showMainMenu() {
System.out.println("<< 홈마이너스 마트 제품 관리 프로그램 >>");
System.out.println("================================");
System.out.println("1.제품 등록");
System.out.println("2.제품 출력");
System.out.println("3.제품 검색");
System.out.println("4.제품 수정");
System.out.println("5.제품 삭제");
System.out.println("0.종료");
System.out.println("================================");
System.out.print("선택 >> ");
}
//서브 타이틀과 서브 메뉴를 출력하는 메소드
public void showSubMenu(String title,int menu) {
System.out.println("<< "+title+" >>");
System.out.println("================================");
switch(menu) {
case 1://카체고리 서브 메뉴
System.out.println("1.가전제품");
System.out.println("2.생필품");
System.out.println("3.식품");
System.out.println("0.돌아가기");
break;
case 2: //출력 서브 메뉴
System.out.println("1.전체출력");
System.out.println("2.카테고리별 출력");
System.out.println("0.돌아가기");
break;
}
System.out.println("================================");
System.out.print("선택 >> ");
}
//전체 출력 및 카테고리 출력용 메소드
//파라미터 : 전체 제품 목록, 카테고리 번호
public void printProduct(ArrayList<Product> pList,int c) {
int cnt=0; //카테고리별 출력 시 제품갯수 카운트
for(Product p:pList) {
switch(c) {
case 0: //전체 출력
case 1: //가전제품
if(p instanceof ElectProduct) {
System.out.println(p);
cnt++;
}
if(c!=0) {
break;
}
case 2: //생필품
if(p instanceof LifeProduct) {
System.out.println(p);
cnt++;
}
if(c!=0) {
break;
}
case 3: //식품
if(p instanceof FoodProduct) {
System.out.println(p);
cnt++;
}
if(c!=0) {
break;
}
}
}
if(cnt==0) {
alertMessage(3);
}
}
//////////////////////////////////////////////입력 처리
//메뉴 입력을 위한 메소드
public int inputMenu() {
String str=scan.nextLine();
int menu=-1;
//숫자를 입력하지 않고 엔터를 쳤을때의 예외사항 막기.
if(!str.equals("")) {
menu=Integer.parseInt(str);
}
return menu;
}
//제품 등록을 위한 입력 메소드
public void inputProduct(Product p) {
//공통 입력 처리
System.out.print("제품명 : ");
p.setName(scan.nextLine());
System.out.print("가격 : ");
p.setPrice(inputMenu()); //숫자문자열 -> 숫자로
System.out.print("수량 : ");
p.setAmount(inputMenu());
System.out.print("생산지 : ");
p.setMade(scan.nextLine());
System.out.print("생산일 : ");
p.setmDay(scan.nextLine());
//각 카테고리 제품별 입력처리
if(p instanceof ElectProduct) {
ElectProduct ep=(ElectProduct)p;
System.out.print("제조사 : ");
ep.setMaker(scan.nextLine());
System.out.print("보증기간 : ");
ep.setGuarantee(inputMenu());
System.out.print("등급 : ");
ep.setGrade(inputMenu());
}else if(p instanceof LifeProduct) {
LifeProduct lp=(LifeProduct)p;
System.out.print("제조사 : ");
lp.setMaker(scan.nextLine());
System.out.print("용도 : ");
lp.setUsage(scan.nextLine());
System.out.print("재활용여부(y/n) : ");
String yesno=scan.nextLine();
if(yesno.equals("y")) {
lp.setRecycle(true);
}else {
lp.setRecycle(false);
}
}else if(p instanceof FoodProduct) {
FoodProduct fp=(FoodProduct)p;
System.out.print("원산지 : ");
fp.setOrigin(scan.nextLine());
System.out.print("유통기한 : ");
fp.setPeriod(scan.nextLine());
System.out.print("종류 : ");
fp.setKind(scan.nextLine());
}
}
}
Service
- ProductService
package com.homeminus.service;
import java.util.ArrayList;
import com.homeminus.dto.Product;
import com.homeminus.util.TestDataInput;
public class ProductService {
//전체 제품 저장 공간. ArrayList로 구성.
private ArrayList<Product> pList=new ArrayList<>();
//더미 데이터 추가용 메소드(테스트용)
public void startPs() {
TestDataInput tdi =new TestDataInput();
tdi.addTestData(pList);
}
//제품 저장용 메소드
//반환형이 boolean인 이유는 저장 결과에 따른 출력값을 주기 위해서
public boolean registProd(Product p) {
//전체 제품 목록에 넘어온 제품 인스턴스 추가
pList.add(p);
//정상적으로 추가되었다고 가정하고 true 리턴
return true;
}
//제품 목록을 전달하는 메소드
public ArrayList<Product> getProductList(){
return pList;
}
}
Comments