본문 바로가기

JAVA

JAVA(23) - 실습 <제품 관리프로그램> /응용실습 - <데이트 관리프로그램>

전체 페키지 및 클래스 목록

 

<제품 관리프로그램>

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);
		}
	}
}