Hayden's Archive

[자바/Java] 렌트 업체의 차량 정보 관리 프로그램 본문

Study/Java & Kotlin

[자바/Java] 렌트 업체의 차량 정보 관리 프로그램

_hayden 2020. 4. 16. 23:58

관련 포스팅
1. 도서관 사서 프로그램 https://hayden-archive.tistory.com/62
2. 상영 영화 관리 프로그램 https://hayden-archive.tistory.com/69

 

- Vehicle Super 클래스와 각각의 Sub 클래스로 Truck, Limousine, Motocycle 이 있다.(상속)

- VO 클래스에는 Encapsulation, toString()을 적용한다.

- VehicleManagerImpl 클래스에 싱글톤을 적용한다.

- VehicleManager 인터페이스를 작성하고 Template Method를 지정한다.

- CRUD 관련 기능 작성하고 메소드 오버로딩을 적용한다.

 

package vehicle;

public class Vehicle {
	private int num;
	private String model;
	private int price;
	public Vehicle() {}
	public Vehicle(int num, String model, int price) {
		super();
		this.num = num;
		this.model = model;
		this.price = price;
	}
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getModel() {
		return model;
	}
	public void setModel(String model) {
		this.model = model;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public String toString() {
		return num +", "+model+", "+price;
	}
}
package vehicle.child;

import vehicle.Vehicle;

public class Limousine extends Vehicle {
	private String vipName; // vip 고객 이름
	private String guard; // 경호원 이름
	public Limousine(int num, String model, int price, String vipName, String guard) {
		super(num, model, price);
		this.vipName = vipName;
		this.guard = guard;
	}
	public String getVipName() {
		return vipName;
	}
	public void setVipName(String vipName) {
		this.vipName = vipName;
	}
	public String getGuard() {
		return guard;
	}
	public void setGuard(String guard) {
		this.guard = guard;
	}
	public String toString() {
		return super.toString()+", "+vipName+", "+guard;
	}
}
package vehicle.child;

import vehicle.Vehicle;

public class Motocycle extends Vehicle {
	private String name; // 운전자 이름
	private int career; // 운전 경력
	public Motocycle(int num, String model, int price, String name, int career) {
		super(num, model, price);
		this.name = name;
		this.career = career;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getCareer() {
		return career;
	}
	public void setCareer(int career) {
		this.career = career;
	}
	public String toString() {
		return super.toString()+", "+name+", "+career;
	}
}
package vehicle.child;

import vehicle.Vehicle;

public class Truck extends Vehicle {
	private int licence; // 면허 종류
	private String company; // 대여 회사명
	public Truck(int num, String model, int price, int licence, String company) {
		super(num, model, price);
		this.licence = licence;
		this.company = company;
	}
	public int isLicence1st() {
		return licence;
	}
	public void setLicence1st(int licence) {
		this.licence = licence;
	}
	public String getCompany() {
		return company;
	}
	public void setCompany(String company) {
		this.company = company;
	}
	public String toString() {
		return super.toString()+", "+licence+", "+company;
	}
}
package vehicle.service;

import vehicle.Vehicle;

public interface VehicleManager {
	Vehicle[] getList();
	void add(Vehicle vehi);
	int searchInfo(String name);
	String searchInfo(int carNum);
	Vehicle[] searchCarInfo(String maker);
	Vehicle highestPrice();
	Vehicle update(int carNum, int price);
	Vehicle[] delete(int carNum);
	int getTotalPrice();
}
package vehicle.service;

import vehicle.Vehicle;
import vehicle.child.Limousine;
import vehicle.child.Motocycle;

public class VehicleManagerImpl implements VehicleManager {
	private Vehicle[] vList = new Vehicle[100];
	private int amount;
	private static VehicleManagerImpl vihiMgr = new VehicleManagerImpl();
	private VehicleManagerImpl() {}
	public static VehicleManagerImpl getInstance() {
		return vihiMgr;
	}
	
	// 전체 차량 목록을 반환함
	public Vehicle[] getList() {
		return vList;
	}
	
	// 차량정보를 추가함
	public void add(Vehicle vehi){
		vList[amount++] = vehi;
	}
	
	// 오토바이 운전자의 이름을 넣으면 운전 경력을 반환함
	public int searchInfo(String name){
		int year = 0;
		for(Vehicle v : vList) {
			if(v == null) continue;
			if(v instanceof Motocycle) {
				if(((Motocycle) v).getName() == name) {
					year = ((Motocycle) v).getCareer();
				}
 			}
		}
		return year;
	}
	
	// 리무진 차량번호를 입력하면 리무진에 타고 있는 VIP와 경호원을 반환함
	public String searchInfo(int carNum){
		String vip = null;
		String guard = null;
		for(Vehicle v : vList) {
			if(v == null) continue;
			if(v instanceof Limousine) {
				if(v.getNum() == carNum) {
					vip = ((Limousine) v).getVipName();
					guard = ((Limousine) v).getGuard();
				}
			}
		}
		return "이 리무진에서는 "+guard+"(가드)님이 "+vip+"(VIP)님을 경호합니다.";
	}
	
	// 제조사를 입력하면 차량 정보를 반환함
	public Vehicle[] searchCarInfo(String maker){
		int index = 0;
		Vehicle[] temp = new Vehicle[amount];
		for(Vehicle v : vList) {
			if(v == null) continue;
			if(v.getModel().equals(maker)) {
				temp[index++] = v;
			}
		}
		Vehicle[] temp2 = new Vehicle[index];
		if(index > 0) {
			System.arraycopy(temp, 0, temp2, 0, index);
		}
		return temp2;
	}
	
	// 최고가 차량의 정보를 반환함
	public Vehicle highestPrice(){
		int max = vList[0].getPrice();
		int index = 0;
		for(int i = 0; i < amount; i++) {
			if(vList[i] == null) continue;
			if(max < vList[i].getPrice()) {
				max = vList[i].getPrice();
				index = i;
			}
		}
		return vList[index];
	}
	
	// 차량번호와 가격을 입력하면 해당 차량번호를 찾아 가격을 수정하고 수정된 정보를 반환함
	public Vehicle update(int carNum, int price){
		Vehicle temp = null;
		for(Vehicle v : vList) {
			if(v == null) continue;
			if(v.getNum() == carNum) {
				v.setPrice(price);
				temp = v;
			}
		}
		return temp;
	}
	
	// 차량번호를 입력하면 해당 차량정보가 삭제되고 전체 차량 목록을 반환함
	public Vehicle[] delete(int carNum){
		for(int i = 0; i < amount; i++) {
			if(vList[i] == null) continue;
			if(vList[i].getNum() == carNum) {
				for(int j = i; j < amount; j++) {
					vList[j] = vList[j+1];
				}
			}
		}
		Vehicle[] temp = new Vehicle[amount-1];
		for(int i = 0; i < amount-1; i++) {
			temp[i] = vList[i];
		}
		return temp;
	}
	
	// 전체 차량의 가격 총합을 반환함
	public int getTotalPrice(){
		int total = 0;
		for(Vehicle v : vList) {
			if(v == null) continue;
			total += v.getPrice();
		}
		return total;
	}
	
}
package vehicle.test;

import java.util.Arrays;

import vehicle.Vehicle;
import vehicle.child.Limousine;
import vehicle.child.Motocycle;
import vehicle.child.Truck;
import vehicle.service.VehicleManagerImpl;

public class VehicleManagerTest {
	public static void main(String[] args) {
		VehicleManagerImpl vehiMgr = VehicleManagerImpl.getInstance();

		vehiMgr.add(new Vehicle(23, "BMW", 100000));
		// int num, String model, int price
		vehiMgr.add(new Truck(16, "벤츠", 90000, 1, "화물운송연합"));
		// int num, String model, int price, int licence, String company
		vehiMgr.add(new Limousine(24, "아우디", 110000, "김혜수", "이희진"));
		// int num, String model, int price, String vipName, String guard
		vehiMgr.add(new Motocycle(55, "BMW", 70000, "송은이", 10));
		vehiMgr.add(new Motocycle(79, "KR모터스", 50000, "박나래", 6));
		// int num, String model, int price, int career
		
		System.out.println("===== 차량정보를 추가함 =====");
		vehiMgr.add(new Vehicle(60, "현대", 100000));
		for(Vehicle v : vehiMgr.getList()) {
			if(v == null) continue;
			System.out.println(v);
		}
		System.out.println("===== 오토바이 운전자의 이름을 넣으면 운전 경력을 반환함 =====");
		System.out.println("오토바이 총 경력 : "+vehiMgr.searchInfo("송은이")+"년");
		System.out.println("===== 리무진 차량번호를 입력하면 리무진에 타고 있는 VIP와 경호원을 반환함 =====");
		System.out.println(vehiMgr.searchInfo(24));
		System.out.println("===== 제조사를 입력하면 차량 정보를 반환함 =====");
		System.out.println(Arrays.toString(vehiMgr.searchCarInfo("BMW")));
		System.out.println("===== 최고가 차량의 정보를 반환함 =====");
		System.out.println(vehiMgr.highestPrice());
		System.out.println("===== 차량번호와 가격을 입력하면 해당 차량번호를 찾아 가격을 수정하고 수정된 정보를 반환함 =====");
		System.out.println(vehiMgr.update(79, 30000));
		System.out.println("===== 차량번호를 입력하면 해당 차량정보가 삭제되고 전체 차량 목록을 반환함 =====");
		System.out.println(Arrays.toString(vehiMgr.delete(16)));
		System.out.println("===== 전체 차량의 가격 총합을 반환함 ====="); 
		System.out.println("합계 : "+vehiMgr.getTotalPrice()+"원");

	}
}