자동차는 객체화가 안되므로 추상화 하는게 좋을 것 같습니다.
구현해야 할 공통의 메소드는 기본 자동차 클래스에서 구현해서 상속주는 것도 좋은 방법 입니다.
차량 이름 표시
이동에 필요한 총 비용 산출(정수표시) : (단, 이동 횟수는 편도만 계산하면 됩니다.)
주유 횟수(정수표시) : ****
총 시간 계산 ( 시간단위로 표시하되 소수점 이라 2자리까지 표시) :
코드 보기
package 자동차종합예제;
import java.util.Scanner;
public class CarTotalMain {
public static void main(String[] args) {
final int[] dist = {0, 400, 150, 200, 300};
Car car = null;
Scanner sc = new Scanner(System.in);
System.out.print("이동 지역 선택 [1]부산 [2]대전 [3]강릉 [4] 광주 : ");
int city = sc.nextInt();
System.out.print("이동할 승객 수 입력 : ");
int passCnt = sc.nextInt();
System.out.print("이동할 차량 선택 [1]스포츠카 [2]승용차 [3]버스 : ");
int carSel = sc.nextInt();
System.out.print("부가 기능 [1]ON [2]OFF : ");
int option = sc.nextInt();
boolean isMode = (option == 1) ? true : false;
switch (carSel) {
case 1 : car = new SportsCar("Ferrari"); break;
case 2 : car = new Sedan("GV80"); break;
case 3 : car = new Bus("관광버스"); break;
default: System.out.println("차량 선택이 잘 못 되었습니다.");
}
car.setMode(isMode);
int moveCnt = car.getMovingCnt(passCnt); // 승객의 수를 입력 받아 이동 횟수를 구함
System.out.println("====== " + car.getName() + " ======");
System.out.println("총 비용 : " + car.getTotalCost(dist[city], moveCnt) + "원");
System.out.println("총 주유 횟수 : " + car.getRefuelCnt(dist[city], moveCnt) + "회");
System.out.printf("총 이동 시간 : %.2f\n", car.getMovingTime(dist[city], moveCnt));
}
}
package 자동차종합예제;
public abstract class Car {
protected int maxSpeed; // 최고속도
protected int fuelEff; // 연비
protected int fuelTank; // 연료 탱크 크기
protected int seatCnt; // 좌석수
protected String name; // 자동차 이름
abstract void setMode(boolean isMode);
// 이동 횟수 구하기 : 입력값으로 승객의 수가 필요
int getMovingCnt(int passCnt) {
if(passCnt % seatCnt != 0) return (passCnt / seatCnt) + 1;
return passCnt / seatCnt;
}
public String getName() {
return name;
}
// 총 이동 비용
int getTotalCost(int dist, int moveCnt) {
return (dist / fuelEff * 2000) * moveCnt;
}
// 총 주유 횟수
int getRefuelCnt(int dist, int moveCnt) {
if(((dist * moveCnt) / fuelEff) % fuelTank != 0)
return (((dist * moveCnt) / fuelEff) / fuelTank) + 1;
else return ((dist * moveCnt) / fuelEff) / fuelTank;
}
// 총 소요 시간
double getMovingTime(int dist, int moveCnt) {
return (double) dist * moveCnt / maxSpeed;
}
}
package 자동차종합예제;
public class SportsCar extends Car {
public SportsCar(String name) {
this.name = name;
maxSpeed = 250;
fuelEff = 8; // 연비
fuelTank = 30;
seatCnt = 2;
}
@Override
void setMode(boolean isMode) {
if(isMode) maxSpeed *= 1.2;
}
}
package 자동차종합예제;
public class Sedan extends Car {
public Sedan(String name) {
this.name = name;
maxSpeed = 200;
fuelEff = 12; // 연비
fuelTank = 45;
seatCnt = 4;
}
@Override
void setMode(boolean isMode) {
if(isMode) seatCnt += 1;
}
}
package 자동차종합예제;
public class Bus extends Car {
public Bus(String name) {
this.name = name;
maxSpeed = 150;
fuelEff = 5; // 연비
fuelTank = 100;
seatCnt = 20;
}
@Override
void setMode(boolean isMode) {
if(isMode) fuelTank += 30;
}
}