Hayden's Archive
[자바/Java] 렌트 업체의 차량 정보 관리 프로그램 본문
관련 포스팅
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()+"원");
}
}