<제품 관리프로그램>
package com.homeminus.dto;
public class LifeProduct extends Product {
private String maker;//제조사
private boolean recycle;//재활용 여부
private String usage;//용도:주방,욕실,거실,베란다 등
public String getMaker() {
return maker;
}
public void setMaker(String maker) {
this.maker = maker;
}
public boolean isRecycle() {
return recycle;
}
public void setRecycle(boolean recycle) {
this.recycle = recycle;
}
public String getUsage() {
return usage;
}
public void setUsage(String usage) {
this.usage = usage;
}
@Override
public String toString() {
String rec;
if(recycle) rec = "재활용";
else rec = "일회용";
//좀더 간단하게 한다면? 조건연산자 활용
//rec = (recycle) ? "재활용" : "일회용";
String str = "제조사: " + maker + "\n"
+ "재활용여부: " + rec + "\n"
+ "용도: " + usage + "\n";
return super.toString() + str;
}
}
HomeMain 클래스
package com.homeminus;
import com.homeminus.controller.MainController;
import com.homeminus.dto.ElectProduct;
import com.homeminus.dto.Product;
public class HomeMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
//하는일 없음. 컨트롤러 호출만 실행.
MainController mc = new MainController();
mc.controll();
}
}
dto - Product(부모 클래스), ElectProduct, FoodProduct, LifeProduct
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;
}
@Override//재정의했다는 것을 나타내는 어노테이션
public String toString() {
//제품 클래스의 필드들 출력하도록 작성
String str = "======================\n"
+ "제품명: " + name + "\n"
+ "가격: " + price + "\n"
+ "수량: " + amount + "\n"
+ "국가: " + made + "\n"
+ "일자: " + mday + "\n";
return str;
}
}
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 = "제조사: " + maker + "\n"
+ "보증기간: " + guarantee + "\n"
+ "등급: " + grade + "\n";
return super.toString() + str;
}
}
package com.homeminus.dto;
public class FoodProduct extends Product {
private String origin;//생산지
private int period;//유통기한
private String kind;//분류:육류,생선류,채소,과일 등
public String getOrigin() {
return origin;
}
public void setOrigin(String origin) {
this.origin = origin;
}
public int getPeriod() {
return period;
}
public void setPeriod(int period) {
this.period = period;
}
public String getKind() {
return kind;
}
public void setKind(String kind) {
this.kind = kind;
}
@Override
public String toString() {
String str = "생산지: " + origin + "\n"
+ "유통기한: " + period + "\n"
+ "분류: " + kind + "\n";
return super.toString() + str;
}
}
MainController 클래스
package com.homeminus.controller;
import java.util.ArrayList;
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 controll() {
//더미 데이터 추가(모든 프로그램이 작성완료되면 삭제)
ps.startPs();
//메뉴 입력용 변수
int menu = 0;
//프로그램 무한 반복 처리
while(true) {
//타이틀과 메인메뉴 출력
pv.showMainMenu();
//메뉴 번호 입력 받기(뷰 클래스)
//뷰 클래스의 번호입력받는 메소드 실행.
menu = pv.inputNum();
//종료처리
if(menu == 0) {
//종료 메시지 출력(뷰 클래스)
pv.printMsg(0);
break;//또는 return;
}
//메뉴 분기 처리
switch(menu) {
case 1://제품 등록
regProduct();
break;
case 2://제품 출력
printProduct();
break;
case 3://제품 검색
searchProduct();
break;
case 4://제품 수정
updateProduct();
break;
case 5://제품 삭제
deleteProduct();
break;
default:
//잘못된 메뉴 번호 입력에 대한 메시지 출력
pv.printMsg(2);
}//switch 끝
}//while 끝
}//controll 메소드 끝
//제품 등록 용 메소드
private void regProduct() {
//서브메뉴 입력용 변수
int sub = 0;
//돌아가기 메뉴가 선택되기 전까지 무한반복
while(true) {
//서브타이틀/서브메뉴 출력(뷰 클래스)
pv.showSubMenu("제품 등록", 1);
//서브메뉴 입력(뷰 클래스)
//뷰 클래스의 번호입력받는 메소드 실행.
sub = pv.inputNum();
if(sub == 0) {
//돌아기기 메시지 출력(뷰 클래스)
pv.printMsg(1);
return;
}
Product p = null;//제품 정보 저장용 임시 공간
//서브메뉴 분기 처리
switch(sub) {
case 1://가전제품 등록
//가전제품용 인스턴스(저장 공간 만들기)
p = new ElectProduct();
break;
case 2://생필품 등록
//생필품용 인스턴스(저장 공간 만들기)
p = new LifeProduct();
break;
case 3://식품 등록
//식품용 인스턴스(저장 공간 만들기)
p = new FoodProduct();
break;
default:
//잘못된 메뉴 번호 입력에 대한 메시지 출력(뷰 클래스)
pv.printMsg(2);
}
//뷰 클래스에서 입력 받기
pv.inputProduct(p);
//서비스 클래스에서 저장
boolean result = ps.registProd(p);
if(result) {
//저장 완료 메시지 출력(뷰 클래스)
pv.printMsg(4);
}
else {
//저장 실패 메시지 출력(뷰 클래스)
pv.printMsg(7);
}
}//while문 끝
}//메소드 끝
//제품 출력 용 메소드
private void printProduct() {
//저장된 목록에 제품이 들어 있는지 확인
//서비스 클래스로부터 제품 목록을 받아와서 확인
ArrayList<Product> pList = ps.getProductList();
if(pList.isEmpty()) {
//isEmpty() : ArrayList에 저장된 데이터가
// 없으면 true, 있으면 false.
//뷰 클래스의 메시지 출력(목록이 비어 있음.)
pv.printMsg(3);
//메소드 종료
return;
}
//2가지 출력 형태(서브메뉴)
//1. 전체 출력
//2. 카테고리별 출력
//0. 돌아가기
//서브메뉴 입력용 변수
int sub = 0;
//돌아가기 메뉴가 선택되기 전까지 무한반복
while(true) {
//서브타이틀/서브메뉴 출력(뷰 클래스)
pv.showSubMenu("제품 출력", 2);
//서브메뉴 입력(뷰 클래스)
//뷰 클래스의 번호입력받는 메소드 실행.
sub = pv.inputNum();
if(sub == 0) {
//돌아기기 메시지 출력(뷰 클래스)
pv.printMsg(1);
return;
}
switch(sub) {
case 1://전체 출력
//전체 목록을 뷰 클래스의 출력 메소드로 전달
pv.printProduct(pList, 0);
break;
case 2://카테고리별 출력(카테고리 서브 메뉴처리)
//카테고리별 출력 메소드 실행
printCate(pList);
break;
default:
//잘못된 메뉴 번호 입력에 대한 메시지 출력
pv.printMsg(2);
}
}
}
//카테고리별 출력 용 메소드
private void printCate(ArrayList<Product> pList) {
//메뉴 번호 입력 변수
int sub = 0;
//돌아가기 메뉴가 선택되기 전까지 무한반복
while(true) {
//카테고리 서브 메뉴 출력
//(제품 등록에서 사용한 메뉴 재활용)
pv.showSubMenu("카테고리별 출력", 1);
//서브메뉴 입력
//뷰 클래스의 번호입력받는 메소드 실행.
sub = pv.inputNum();
if(sub == 0) {
//돌아기기 메시지 출력
pv.printMsg(1);
return;
}
//뷰 클래스의 카테고리별 출력 메소드 사용
//카테고리 선택 번호(서브메뉴번호)를 출력
//메소드에 전달
pv.printProduct(pList, sub);
}
}
//제품 검색 용 메소드
private void searchProduct() {
//저장된 목록에 제품이 들어 있는지 확인
//서비스 클래스로부터 제품 목록을 받아와서 확인
ArrayList<Product> pList = ps.getProductList();
if(pList.isEmpty()) {
//isEmpty() : ArrayList에 저장된 데이터가
// 없으면 true, 있으면 false.
//뷰 클래스의 메시지 출력(목록이 비어 있음.)
pv.printMsg(3);
//메소드 종료
return;
}
//뷰 클래스의 문자열 입력 메소드 사용(검색 이름)
String name = pv.inputStr("검색 이름: ");
if(name.equals("")) {
//이름을 입력하지 않은 경우.
//메시지 출력 후 메뉴로 돌아가기.
pv.printMsg(2);
return;
}
//서비스 클래스의 제품 검색 메소드 사용
Product prod = ps.searchProd(name);
//검색 결과가 있으면
if(prod != null) {
//뷰 클래스의 검색된 제품 정보 출력 메소드 사용
pv.searchResult(prod);
}
else {//검색 결과가 없으면
//검색 결과 없음 메시지 출력
pv.printMsg(6);
}
}
//제품 수정 용 메소드
private void updateProduct() {
//저장된 목록에 제품이 들어 있는지 확인
//서비스 클래스로부터 제품 목록을 받아와서 확인
ArrayList<Product> pList = ps.getProductList();
if(pList.isEmpty()) {
//isEmpty() : ArrayList에 저장된 데이터가
// 없으면 true, 있으면 false.
//뷰 클래스의 메시지 출력(목록이 비어 있음.)
pv.printMsg(3);
//메소드 종료
return;
}
//뷰 클래스의 문자열 입력 메소드 사용(검색 이름)
String name = pv.inputStr("검색 이름: ");
//서비스 클래스의 제품 검색 메소드 사용
Product prod = ps.searchProd(name);
//검색한 제품 정보가 있으면
if(prod != null) {
//뷰 클래스의 검색된 제품 정보 출력 메소드 사용
pv.searchResult(prod);
//뷰 클래스의 수정 내용 입력 메소드 사용
//가정. 이 프로그램에서는 제품의 수량만 수정할 수 있음.
int updateNum = pv.updateNum();
if(updateNum != -1) {
//정상적인 변경 값이 입력되었을 경우
//서비스 클래스의 정보 수정 메소드 사용
boolean result = ps.updateProd(name, updateNum);
if(result) {
//수정 성공 메시지 출력
pv.printMsg(4);
}
else {
//수정 실패 메시지 출력
pv.printMsg(7);
}
}
else {
//엔터가 입력되었을 경우. 메시지 출력
pv.printMsg(2);
}
}
else {
pv.printMsg(6);
}
}
//제품 삭제 용 메소드
private void deleteProduct() {
//메뉴 번호 입력 변수
int sub = 0;
//돌아가기 메뉴가 선택되기 전까지 무한반복
while(true) {
//삭제 서브 메뉴 출력
//서브메뉴 입력
//sub = 뷰 클래스의 번호입력받는 메소드 실행.
if(sub == 0) {
//돌아기기 메시지 출력
pv.printMsg(1);
return;
}
switch(sub) {
case 1://서비스 클래스의 전체 삭제 메소드 실행
deleteTotal();
break;
case 2://검색 삭제
//검색 삭제 메소드 실행
deleteSearch();
break;
default:
//잘못된 메뉴 번호 입력에 대한 메시지 출력
pv.printMsg(2);
}
}
}
private void deleteTotal() {
String yesno = "";
//뷰클래스의 문자열 입력 메소드 사용(실행여부. y/n)
//yesno에 y가 입력되면
if(yesno.equals("y") || yesno.equals("Y")) {
//서비스 클래스의 전체 삭제 메소드 사용
}
else {//yesno에 n이 입력되면 메소드 종료
//뷰 클래스에서 취소 메시지 출력
return;
}
}
private void deleteSearch() {
//뷰 클래스의 문자열 입력 메소드 사용(검색 이름)
//서비스 클래스의 제품 검색 메소드 사용
//검색한 제품 정보가 있으면
//뷰 클래스의 검색된 제품 정보 출력 메소드 사용
String yesno = "";
//뷰클래스의 문자열 입력 메소드 사용(실행여부. y/n)
//yesno에 y가 입력되면
if(yesno.equals("y") || yesno.equals("Y")) {
//서비스 클래스의 제품 삭제 메소드 사용
}
else {//yesno에 n이 입력되면 메소드 종료
//뷰 클래스에서 취소 메시지 출력
return;
}
}
}//클래스 끝
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);
}//startPs 끝
//제품 저장용 메소드
public boolean registProd(Product p) {
//반환형이 boolean인 이유는 저장에 실패할 수도 있기 때문.
//전체 제품 목록에 넘어온 제품 인스턴스 추가
pList.add(p);
//정상적으로 추가되었다고 가정함.
return true;
}//메소드 끝
//제품 목록을 전달하는 메소드
public ArrayList<Product> getProductList(){
return pList;
}
//제품 검색 처리 메소드
public Product searchProd(String name) {
for(Product p : pList) {
if(name.equals(p.getName())) {
return p;
}
}
return null;//검색 결과 없음.(해당 제품 없음)
}//검색 메소드 끝
//수정 메소드
public boolean updateProd(String name, int uNum) {
for(Product p : pList) {
if(name.equals(p.getName())) {
//검색한 이름에 해당하는 제품의 수량 변경
p.setAmount(uNum);
return true;
}
}
return false;
}
}//클래스 끝
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 {
//입력, 출력 작업은 모두 이 클래스에서 처리
private Scanner scan = new Scanner(System.in);
//타이틀과 메인 메뉴를 출력하는 메소드 작성
public void showMainMenu() {
System.out.println();
System.out.println("*** 홈마이너스 마트 제품 관리 프로그램 ***");
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("선택>> ");
}//showMainMenu 끝
//서브 타이틀과 서브메뉴의 번호를 입력받아서 해당
//서브 메뉴를 출력한다.
public void showSubMenu(String title, int c) {
System.out.println();//줄바꿈
System.out.println(title);
System.out.println("==========================================");
System.out.println("메뉴>");
switch(c) {
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;
case 3://삭제 서브 메뉴
break;
}
//모든 서브 메뉴에서 공통으로 출력될 내용.
System.out.println("==========================================");
System.out.print("선택>> ");
}
/////////////////////////여기까지 메뉴처리 부분
//번호 받기 메소드
public int inputNum() {
//scanner의 문제
//번호 뒤에 문자열을 입력받을 때 입력이 안되는 문제
String str = scan.nextLine();//입력은 문자열로..
int num = -1;
//숫자를 입력하지 않고 엔터를 쳤을 때의 예외사항 막기.
if(!str.equals("")) {
num = Integer.parseInt(str);
}
return num;
}//숫자 입력 메소드 끝
//문자열 입력 메소드
public String inputStr(String str) {
System.out.print(str);
return scan.nextLine();
}//문자열 입력 메소드 끝
public void inputProduct(Product p) {
//공통부분 입력 처리
System.out.print("제품명: ");
p.setName(scan.nextLine());
System.out.print("가격: ");
p.setPrice(inputNum());//숫자문자열 -> 숫자 변환
System.out.print("수량: ");
p.setAmount(inputNum());
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("제조사: ");
//((ElectProduct)p).setMaker(scan.nextLine());
ep.setMaker(scan.nextLine());
System.out.print("보증기간: ");
ep.setGuarantee(inputNum());
System.out.print("등급: ");
ep.setGrade(inputNum());
}
else if(p instanceof LifeProduct) {
LifeProduct lp = (LifeProduct)p;
System.out.print("제조사: ");
lp.setMaker(scan.nextLine());
System.out.print("재활용(y/n): ");
String yesno = scan.nextLine();
if(yesno.equals("y")) {
lp.setRecycle(true);
}
else {
lp.setRecycle(false);
}
System.out.print("용도: ");
lp.setUsage(scan.nextLine());
}
else {
FoodProduct fp = (FoodProduct)p;
System.out.print("생산지: ");
fp.setOrigin(scan.nextLine());
System.out.print("유통기한: ");
fp.setPeriod(inputNum());
System.out.print("분류: ");
fp.setKind(scan.nextLine());
}
}//메소드 끝
//변경 수량 입력 메소드
public int updateNum() {
System.out.print("변경 수량: ");
int uNum = inputNum();
return uNum;
}
/////////////////////////////여기까지 입력 처리 부분
public void printMsg(int m) {
switch(m) {
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;
}
}//printMsg 메소드 끝
//전체 출력 및 카테고리 출력용 메소드
//파리미터 : 전체 제품 목록, 카테고리 번호
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 스킵.
break;
}
case 2://생필 출력
if(p instanceof LifeProduct) {
System.out.println(p);
cnt++;
}
if(c != 0) {//전체 출력일 경우 break 스킵.
break;
}
case 3://식품 출력
if(p instanceof FoodProduct) {
System.out.println(p);
cnt++;
}
if(c != 0) {//전체 출력일 경우 break 스킵.
break;
}
}//switch 끝
}//for문 끝
if(cnt == 0) {
System.out.println("해당 제품이 없습니다.");
}
}//메소드 끝
public void searchResult(Product p) {
//전달받은 제품 인스턴스 출력
System.out.println("검색 결과");
System.out.println(p);
}
}//클래스 끝
더미 데이터 입력
package com.homeminus.util;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Vector;
import com.homeminus.dto.*;
public class TestDataInput {
public void addTestData(ArrayList<Product> productList) {
Calendar cal = Calendar.getInstance();
//싱글턴 패턴
int year = cal.get(Calendar.YEAR);//현재 연도
int month = cal.get(Calendar.MONTH) + 1;//현재 월
int day = cal.get(Calendar.DAY_OF_MONTH);//오늘
String mday = "" + year + month + day;
for(int i = 0; i < 3; i++) {
ElectProduct p = new ElectProduct();
p.setName(i + "elec");
p.setPrice((i+1) * 1000);
p.setAmount((i+1) * 10);
p.setMade("made" + i);
p.setGrade(2);
p.setGuarantee(2);
p.setMaker("maker" + i);
p.setMday(mday);
productList.add(p);
}
for(int i = 0; i < 3; i++) {
LifeProduct p = new LifeProduct();
p.setName(i + "life");
p.setPrice((i+1) * 1000);
p.setAmount((i+1) * 10);
p.setMade("made" + i);
p.setRecycle(false);
p.setUsage("공용");
p.setMaker("maker" + i);
p.setMday(mday);
productList.add(p);
}
for(int i = 0; i < 3; i++) {
FoodProduct p = new FoodProduct();
p.setName(i + "food");
p.setPrice((i+1) * 1000);
p.setAmount((i+1) * 10);
p.setMade("made" + i);
p.setKind("과일");
p.setOrigin("origin");
p.setPeriod(7);
p.setMday(mday);
productList.add(p);
}
}
}
<데이트 관리프로그램>
위 실습을 응용해서 제가 직접 해본 프로그램입니다.
HomeMain 클래스
package com.CoupleDatePrj.main;
import com.CoupleDatePrj.controller.MainController;
public class HomeMain {
public static void main(String[] args) {
MainController mc = new MainController();
mc.control();
}
}
dto - Date(부모 클래스), RestaurantDate, PlaceDate, ShopDate
package com.CoupleDatePrj.dto;
public class Date {
private String place;//장소명
private String addr;//주소
private String season;//추천계절
private boolean parking;//주차여부
private boolean booking;//예약여부
private int score;//별점
public String getPlace() {
return place;
}
public void setPlace(String place) {
this.place = place;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getSeason() {
return season;
}
public void setSeason(String season) {
this.season = season;
}
public boolean isParking() {
return parking;
}
public void setParking(boolean parking) {
this.parking = parking;
}
public boolean isBooking() {
return booking;
}
public void setBooking(boolean booking) {
this.booking = booking;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
String park,book;
if(parking) {
park = "주차가능";
}
else {
park = "주차불가";
}
if(booking) {
book = "예약가능";
}
else {
book = "예약불가";
}
String str = "=================================\n"
+ "장소명: " + place + "\n"
+ "주소: " + addr + "\n"
+ "추천계절: " + season + "\n"
+ "주차여부: " + park + "\n"
+ "예약여부: " + book + "\n"
+ "별점(1~5): " + score + "\n" ;
return str;
}
}
package com.CoupleDatePrj.dto;
public class RestaurantDate extends Date{
private String recmenu;//추천메뉴
private int price;//가격
public String getRecmenu() {
return recmenu;
}
public void setRecmenu(String recmenu) {
this.recmenu = recmenu;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
String str ="============================\n"
+"추천메뉴 : "+ recmenu +"\n"
+"가격 : "+ price +"\n";
return super.toString() + str;
}
}
package com.CoupleDatePrj.dto;
public class PlaceDate extends Date{
private int fee;//입장료
private boolean transport;//대중교통 여부
public int getFee() {
return fee;
}
public void setFee(int fee) {
this.fee = fee;
}
public boolean isTransport() {
return transport;
}
public void setTransport(boolean transport) {
this.transport = transport;
}
@Override
public String toString() {
String trans;
if(transport) {
trans = "주차가능";
}
else {
trans = "주차불가";
}
String str = "=================================\n"
+ "입장료: " + fee + "\n"
+ "대중교통 여부: " + trans + "\n";
return super.toString() + str;
}
}
package com.CoupleDatePrj.dto;
public class ShopDate extends Date{
private String booktime;//예약가능시간
private String reqtime;//소요시간
public String getBooktime() {
return booktime;
}
public void setBooktime(String booktime) {
this.booktime = booktime;
}
public String getReqtime() {
return reqtime;
}
public void setReqtime(String reqtime) {
this.reqtime = reqtime;
}
@Override
public String toString() {
String str = "=================================\n"
+ "예약가능시간: " + booktime + "\n"
+ "소요시간: " + reqtime + "\n";
return super.toString() + str;
}
}
MainController 클래스
package com.CoupleDatePrj.controller;
import java.util.ArrayList;
import com.CoupleDatePrj.dto.Date;
import com.CoupleDatePrj.dto.PlaceDate;
import com.CoupleDatePrj.dto.RestaurantDate;
import com.CoupleDatePrj.dto.ShopDate;
import com.CoupleDatePrj.service.DateService;
import com.CoupleDatePrj.view.DateView;
public class MainController {
DateView dv = new DateView();
DateService ds = new DateService();
//메인 메뉴에 해당하는 화면 출력 및 각 메뉴에 해당하는 메소드 실행
public void control() {
// //더미 데이터 입력 메소드
// ds.startDs();
//메뉴 입력 받는 변수 선언
int menu = 0;
//메뉴 무한 반복 실행
while(true) {
//뷰에서 메인메뉴 출력 메소드 호출
dv.showMainMenu();
//뷰에서 번호 입력 메소드 리턴값 menu에 삽입
menu = dv.inputNum();
//프로그램 종료 처리
if(menu == 0) {
//0번 입력 시 뷰에서 printmsg case 0번 출력
dv.printMsg(0);
break;//종료
}
//1~5번 입력 시 해당 메소드 실행
switch(menu) {
case 1:
regDate();//장소 등록
break;
case 2:
printDate();//장소 출력
break;
case 3:
searchDate();//장소 검색
break;
case 4:
updateDate();//장소 수정
break;
case 5:
deleteDate();//장소 삭제
break;
default:
//뷰에서 printMsg case2 출력
dv.printMsg(2);
}
}
}
//등록 메소드
private void regDate() {
//서브메뉴 입력 받는 변수
int sub = 0;
//서브메뉴 무한 반복 실행
while(true) {
//뷰로 서브메뉴 제목, 서브메뉴 번호 매개변수로 전달
dv.showSubMenu("장소 등록", 1);
//뷰에서 번호 입력 메소드 리턴값 sub에 삽입
sub = dv.inputNum();
//프로그램 종료 처리
if(sub == 0) {
//프로그램 종료 메시지 출력
dv.printMsg(1);
return;//서브메뉴 종료 후 메인 메뉴로 return
}
// Date 인스턴스 생성 및 null값 삽입
Date d = null;
//입력 받은 sub 값에 따라 d에 새로운 인스턴스 대입 -> 카테고리별
switch(sub) {
case 1:
//맛집 인스턴스 생성
d = new RestaurantDate();
break;
case 2:
//관광명소 인스턴스 생성
d = new PlaceDate();
break;
case 3:
//공방 인스턴스 생성
d = new ShopDate();
break;
default:
//0~3 이외의 번호 입력시 안내문 출력
dv.printMsg(2);
}
//뷰에서 인스턴스 입력용 메소드 실행
dv.inputDate(d);
//서비스에서 d값 배열에 추가시킴
boolean result = ds.registDate(d);
//registDate 메소드에서 T/F값 리턴 받아서 뷰에서 성공/실패 출력문 실행
if(result) {
//등록 성공
dv.printMsg(4);
}
else {
//등록 실패
dv.printMsg(7);
}
}
}
//출력 메소드
private void printDate() {
ArrayList<Date> dList = ds.getDateList();
if(dList.isEmpty()) {
//인스턴스에 데이터 없을 경우 뷰에서 안내문 철력
dv.printMsg(3);
return;//이전 메뉴로 돌아감
}
//서브메뉴 입력용 변수 선언
int sub = 0;
//서브메뉴 무한 반복 실행
while(true) {
//뷰로 서브메뉴 제목, 서브메뉴 번호 매개변수로 전달
dv.showSubMenu("장소 출력", 2);
//뷰에서 번호 입력 메소드 리턴값 sub에 삽입
sub = dv.inputNum();
//프로그램 종료 처리
if(sub == 0) {
//프로그램 종료 메시지 출력
dv.printMsg(1);
return;//서브메뉴 종료 후 메인 메뉴로 return
}
//입력받은 sub의 값에 따라 출력 방법 선택
switch(sub) {
case 1:
//뷰에서 전체 출력을 위해 배열인스턴스와 0 매개변수 보내줌
dv.printDate(dList, 0);
break;
case 2:
//
printDate(dList);
break;
default:
dv.printMsg(2);
}
}
}
private void printDate(ArrayList<Date> dList) {
//서브메뉴 입력 받는 변수
int sub = 0;
//서브메뉴 입력 받는 변수
while(true) {
//뷰로 서브메뉴 제목, 서브메뉴 번호 매개변수로 전달
dv.showSubMenu("카테고리별 출력", 1);
//뷰에서 번호 입력 메소드 리턴값 sub에 삽입
sub = dv.inputNum();
//프로그램 종료 처리
if(sub == 0) {
//프로그램 종료 메시지 출력
dv.printMsg(1);
return;//서브메뉴 종료 후 메인 메뉴로 return
}
//sub 번호에 따라서 출력 결정
dv.printDate(dList, sub);
}
}
//검색 메소드
private void searchDate() {
ArrayList<Date> dList = ds.getDateList();
//배열에 데이터가 없을 경우 데이터 없음 안내문 출력
if(dList.isEmpty()) {
dv.printMsg(3);
return;
}
//뷰에서 문자열 입력받아서 name에 대입
String name = dv.inputStr("장소 이름: ");
if(name.equals("")) {
//입력 받은 문자열이 없을 시 안내문 출력
dv.printMsg(2);
return;//이전 화면으로 돌아감
}
//검색할 검색어를 서비스의 searchDate 메소드로 보내서 조건에 맞는 인스턴스 반환 받아서 date에 대입
Date date = ds.searchDate(name);
//검색되어 date에 저장된 값이 있다면
if(date != null) {
//뷰에서 date를 매개변수로 받아 출력해줌
dv.searchResult(date);
}
else {
//검색되어 date에 저장된 값이 없다면 뷰에서 안내문 출력
dv.printMsg(6);
}
}
//수정 메소드
private void updateDate() {
ArrayList<Date> dList = ds.getDateList();
//dList 인스턴스가 비어있을 경우
if(dList.isEmpty()) {
//안내문 출력 후 이전 화면으로 돌아감
dv.printMsg(3);
return;
}
//뷰에서 검색할 검색어 받아서 name에 대입시킴
String name = dv.inputStr("검색 이름: ");
//검색어가 대입된 name변수를 서비스에 있는 검색 메소드에서 비교하여 조건에 맞는 값 반환 받아 date에 대입
Date date = ds.searchDate(name);
//date 인스턴스에 값이 있다면
if(date != null) {
//뷰에서 date를 매개변수로 받아서 출력해줌
dv.searchResult(date);
//뷰에서 반환 받은 값을 updateNum에 대입시켜줌
int updateNum = dv.updateNum();
if(updateNum != -1) {
//서비스에서 name으로 인스턴스 검색해서 updateNum으로 수정
boolean result = ds.updateDate(name, updateNum);
if(result) {
//뷰에서 수정 완료 메시지 출력
dv.printMsg(4);
}
else {
//뷰에서 수정 실패 메시지 출력
dv.printMsg(7);
}
}
else {
//잘못 입력시 메시지 출력
dv.printMsg(2);
}
}
//인스턴스에 데이터 값 없을 시
else {
dv.printMsg(6);
}
}
//삭제 메소드
private void deleteDate() {
//서브메뉴 입력 받는 변수
int sub = 0;
//서브메뉴 입력 받는 변수
while (true) {
//뷰에서 서브메뉴 case3에 해당하는 화면 출력
dv.showSubMenu("제품 삭제", 3);
//뷰에서 서브메뉴 입력받기
sub = dv.inputNum();
//0번 입력 받을 시
if (sub == 0) {
//안내문 출력 후 이전화면으로 돌아가기
dv.printMsg(1);
return;
}
//입력받은 sub의 값에 따라 삭제 방법 선택
switch (sub) {
case 1:
deleteTotal();//전체 삭제
break;
case 2:
deleteSearch();//검색 삭제
break;
default:
//잘못 입력시 뷰에서 안내문 출력
dv.printMsg(2);
}
}
}
//전체 삭제 메소드
private void deleteTotal() {
//뷰에서 삭제 확인 입력 받아서 yesno로 대입
String yesno = dv.inputStr("y/n: ");
//삭제 동의시
if (yesno.equals("y") || yesno.equals("Y")) {
//삭제 결과 반환받아서 result에 대입
boolean result = ds.deleteDate();
//삭제 결과 출력해주기
if (result) {
dv.printMsg(5);//삭제 성공
}
else {
dv.printMsg(8);//삭제 실패
}
}
else {
dv.printMsg(9);//잘못 입력시 안내문 출력
return;
}
}
//검색 삭제 메소드
private void deleteSearch() {
//뷰에서 검색할 검색어 입력받기
String name = dv.inputStr("검색 이름: ");
//서비스에서 반환값 date에 대입
Date date = ds.searchDate(name);
//null값이 아닌 경우
if (date != null) {
//뷰에서 검색한 인스턴스 데이터 출력
dv.searchResult(date);
//뷰에서 삭제 확인 입력 받아서 변수에 대입
String yesno = dv.inputStr("y/n: ");
//뷰에서 동의 입력 받았을 시
if (yesno.equals("y") || yesno.equals("Y")) {
//서비스에서 삭제 여부 반환값 변수에 대입
boolean result = ds.deleteDate2(date);
//삭제 결과 출력
if(result) {
dv.printMsg(5);//삭제 성공
}
else {
dv.printMsg(8);//삭제 실패
}
}
else {
dv.printMsg(2);
return;
}
}
}
}
DateService 클래스
package com.CoupleDatePrj.service;
import java.util.ArrayList;
import com.CoupleDatePrj.dto.Date;
import com.CoupleDatePrj.util.TestDataInput;
public class DateService {
//Date형 배열 선언
private ArrayList<Date> dList = new ArrayList<>();
//더미 데이터 추가 메소드
public void startDs() {
TestDataInput tdi = new TestDataInput();
tdi.addTestData(dList);
}
//입력 데이터 배열에 추가해주는 메소드
public boolean registDate(Date d) {
//dList에 매개변수 d 저장
dList.add(d);
return true;//결과값 true/false로 반환
}
//데이터 반환
public ArrayList<Date> getDateList() {
return dList;
}
//매개변수와 d인스턴스의 데이터를 비교해서 조건에 맞는 값 반환시켜줌
public Date searchDate(String place) {
for (Date d : dList) {
if (place.equals(d.getPlace())) {
return d;
}
}
return null;
}
//매개변수로 받은 place로 인스턴스 검색하고 sNum으로 데이터 수정 -> 결과값 T/F로 반환
public boolean updateDate(String place, int sNum) {
for (Date d : dList) {
if (place.equals(d.getPlace())) {
//별점 데이터 수정
d.setScore(sNum);
return true;
}
}
return false;
}
//배열 데이터 전체 삭제
public boolean deleteDate() {
dList.clear();
return true;
}
//
public boolean deleteDate2(Date d) {
for (int i = 0; i < dList.size(); i++) {
Date d1 = dList.get(i);
if (d.getPlace().equals(d1.getPlace())) {
dList.remove(i);
return true;
}
}
return false;
}
}
DateView 클래스
package com.CoupleDatePrj.view;
import java.util.ArrayList;
import java.util.Scanner;
import com.CoupleDatePrj.dto.Date;
import com.CoupleDatePrj.dto.PlaceDate;
import com.CoupleDatePrj.dto.RestaurantDate;
import com.CoupleDatePrj.dto.ShopDate;
public class DateView {
private Scanner scan = new Scanner(System.in);
//메인 메뉴 출력
public void showMainMenu() {
System.out.println();
System.out.println("*** 데이트 안내 프로그램 ***");
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("==========================================");
System.out.print("선택>> ");
}
//서브 메뉴 출력
public void showSubMenu(String title, int c){
System.out.println();
System.out.println(title);
System.out.println("==========================================");
System.out.println("메뉴>");
switch (c) {
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;
case 3:
System.out.println("1. 전체 삭제");
System.out.println("2. 검색 삭제");
System.out.println("0. 돌아가기");
break;
default:
break;
}
System.out.println("========================================");
System.out.print("선택>> ");
}
//번호 입력 메소드
public int inputNum() {
//String으로 입력 받음
String str = scan.nextLine();
int num = -1;
//문자열을 입력 받는다면, 입력 받은 값 정수로 변환시켜서 num에 대입
if (!str.equals("")) {
num = Integer.parseInt(str);
}
return num;
}
//문자열 입력 메소드
//뷰에서 문자열 매개변수로 받아서 출력해주고 입력값 반환해줌
public String inputStr(String str) {
System.out.print(str);
return scan.nextLine();
}
//인스턴스에 입력 데이터값 저장하기 위한 메소드
public void inputDate(Date d) {
System.out.print("장소명: ");
d.setPlace(scan.nextLine());
System.out.print("주소: ");
d.setAddr(scan.nextLine());
System.out.print("추천계절: ");
d.setSeason(scan.nextLine());
System.out.print("주차여부(y/n): ");
String yesno = scan.nextLine();
if (yesno.equals("y")) {
d.setParking(true);
} else {
d.setParking(false);
}
System.out.print("예약여부(y/n): ");
yesno = scan.nextLine();
if (yesno.equals("y")) {
d.setBooking(true);
} else {
d.setBooking(false);
}
System.out.print("별점(1~5): ");
d.setScore(inputNum());
if (d instanceof PlaceDate) {
PlaceDate pd = (PlaceDate) d;
System.out.print("입장료 : ");
pd.setFee(inputNum());
System.out.print("대중교통 여부(y/n): ");
yesno = scan.nextLine();
if (yesno.equals("y")) {
pd.setTransport(true);
} else {
pd.setTransport(false);
}
} else if (d instanceof RestaurantDate) {
RestaurantDate rd = (RestaurantDate) d;
System.out.print("추천메뉴: ");
rd.setRecmenu(scan.nextLine());
System.out.print("가격: ");
rd.setPrice(inputNum());
} else {
ShopDate sd = (ShopDate) d;
System.out.print("예약가능시간: ");
sd.setBooktime(scan.nextLine());
System.out.print("소요시간: ");
sd.setReqtime(scan.nextLine());
}
}
//수정용 메소드, 수정받을 값을 입력 받아서 반환해줌
public int updateNum() {
System.out.print("별점 수정: ");
int uNum = inputNum();
return uNum;
}
//case에 따른 안내문구 출력
public void printMsg(int m) {
switch(m) {
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 printDate(ArrayList<Date> dList, int c) {
int cnt = 0;
//출력을 위한 for문
for(Date d : dList) {
switch(c) {
case 0:
case 1:
if(d instanceof RestaurantDate) {
System.out.println(d);
cnt++;
}
if(c != 0) {
break;
}
case 2:
if(d instanceof PlaceDate) {
System.out.println(d);
cnt++;
}
if(c != 0) {
break;
}
case 3:
if(d instanceof ShopDate) {
System.out.println(d);
cnt++;
}
if(c != 0) {
break;
}
}
}
if(cnt == 0) {
System.out.println("해당 장소가 없습니다.");
}
}
//매개변수로 받은 값을 출력해줌
public void searchResult(Date d) {
System.out.println("검색 결과");
System.out.println(d);
}
}
더미 데이터 클래스
package com.CoupleDatePrj.util;
import java.util.ArrayList;
import com.CoupleDatePrj.dto.Date;
import com.CoupleDatePrj.dto.PlaceDate;
import com.CoupleDatePrj.dto.RestaurantDate;
import com.CoupleDatePrj.dto.ShopDate;
public class TestDataInput {
public void addTestData(ArrayList<Date> dateList) {
for(int i = 0; i<3; i++) {
RestaurantDate d = new RestaurantDate();
d.setPlace(i+"rest");
d.setAddr(i+"addrNum");
d.setSeason(i+"여름");
d.setParking(false);
d.setBooking(true);
d.setScore(5);
d.setRecmenu(i+"pizza");
d.setPrice((i+1)*10000);
dateList.add(d);
}
for(int i = 0; i < 3; i++) {
PlaceDate d = new PlaceDate();
d.setPlace(i + "민속촌");
d.setAddr(i + "경기도 용인시 기흥구 민속촌로 90");
d.setSeason(i + "가을");
d.setParking(true);
d.setBooking(false);
d.setScore(4);
d.setFee(22000);
d.setTransport(true);
dateList.add(d);
}
for(int i = 0; i < 3; i++) {
ShopDate d = new ShopDate();
d.setPlace(i + "공방");//장소명
d.setAddr(i + "호실");//주소
d.setSeason("봄");//추천계절
d.setParking(true);//주차여부
d.setBooking(true);//예약여부
d.setScore(i);//별점
d.setBooktime((i+1) + "시");//예약가능시간
d.setReqtime(i + "시간");//소요시간
dateList.add(d);
}
}
}
'JAVA' 카테고리의 다른 글
JAVA(22) - 예외처리/Exception Handling/try/catch/finally/throw/ throws (0) | 2020.04.07 |
---|---|
JAVA(21) - Super/부모클래스 생성자 생성 방법/생성자들의 실행 순서 (0) | 2020.03.30 |
JAVA(20) - 캡슐화(정보 은닉)/상속/상속의 장점/상속의 계층화/상속과 포함관계를 모두 사용한 새로운 클래스 작성/클래스 상속 받는 방법/상속 실습 프로젝트 만들어보기/Override (오버라이드)/.. (0) | 2020.03.27 |
JAVA(19) - 생성자/기본 생성자/메소드 오버로딩/Method Overloading/ (0) | 2020.03.18 |
JAVA(18) - 콜백함수/(STATIC/인스턴스)메소드에서 호출 (0) | 2020.03.17 |