[Java] 객체 지향 연습(대중 교통)

Jay Mild Lee·2022년 11월 27일
0

Java

목록 보기
8/10

I. 설계 요구 사항

1. ‘Bus’ 클래스 모델링

1) 포함해야 할 정보

  1. 최대 승객수
  2. 현재 승객수
  3. 요금
  4. 버스 번호
  5. 주유량
  6. 현재 속도
  7. 상태 : 운행 중/ 운행 종료

2) 기능

  1. 운행
  2. 버스 상태 변경
  3. 승객 탑승
  4. 속도 변경

3) 요구사항

  • 버스 번호
    - 버스 객체 생성시 번호는 고유값으로 생성되어야 합니다.
    • 버스 상태 변경
      • 버스 객체 생성시 최초 상태는 ‘운행’ 상태가 되며
      • 주유량이 떨어지거나, 운행을 종료할 때 ‘차고지행’ 상태로 변경 합니다.
      • 10미만일 경우 ‘주유가 필요하다’는 메시지를 출력해 주세요
    • 승객 탑승
      • 승객 탑승은 ‘최대 승객수’ 이하까지 가능하며 ‘운행 중’인 상태의 버스만 가능합니다.
      • 탑승시 현재 승객수가 증가되어야 합니다.
    • 속도 변경
      • 주유 상태를 체크하고 주유량이 10 이상이어야 운행할 수 있습니다.
        • 경고메시지
          • 주유량을 확인해 주세요.
          • print문으로 출력
      • 변경할 속도를 입력 받아 현재 속도에 추가 하거나 뺄 수 있어야 합니다.

2. ‘Taxi’ 클래스 모델링

1) 포함해야 할 정보

  1. 택시 번호
  2. 주유량
  3. 현재속도
  4. 목적지
  5. 기본거리
  6. 목적지까지 거리
  7. 기본 요금
  8. 거리당 요금
  9. 상태 (운행 중, 일반, 운행불가)

2) 기능

  1. 운행시작
  2. 승객 탑승
  3. 속도 변경
  4. 거리당 요금 추가
  5. 요금 결제

3) 요구 사항

  • 운행 시작
    - 운행 시작전 주유상태를 체크 하고 주유량이 10 이상이어야 운행 가능
    - 승객탑승
    - 승객 탑승은 택시 상태가 ‘일반'일 때만 가능합니다.
    - 그 외 택시는 ‘탑승 불가’ 처리를 해주세요.
    - ‘일반’ 상태의 택시가 승객을 태우면 ‘운행 중’ 상태로 변경해 주세요
    - 속도 변경
    - 변경할 속도를 입력 받아 현재 속도에 추가 하거나 뺄 수 있어야 합니다.
    - 거리당 요금 추가
    - 기본 거리보다 먼 곳은 추가 요금이 붙습니다.
    - 기본 거리와 추가 요금은 자유롭게 산정해 주세요
    - 요금 결제
    - 최종 요금을 출력하는 것으로 합니다.

II. 설계

1. domian Class

1) abstract Vehicle

추상 클래스 Vehicle 선언. 대중 교통(Bus, Taxi)가 가지는 공통적인 fieldgetter, setter를 포함.

package domain;

public abstract class Vehicle {
    // field
    private int number;
    private int fuel;
    private int speed;
    private Boolean status;
    private int maxPassenger;
    private int presentPassenger;

    // constructor
    public Vehicle(){
        this.fuel = 100;
        this.speed = 0;
        this.presentPassenger = 0;
    }

    // getter and setter

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public int getFuel() {
        return fuel;
    }

    public void setFuel(int fuel) {
        this.fuel = fuel;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public Boolean getStatus() {
        return status;
    }

    public void setStatus(Boolean status) {
        this.status = status;
    }

    public int getMaxPassenger() {
        return maxPassenger;
    }

    public void setMaxPassenger(int maxPassenger) {
        this.maxPassenger = maxPassenger;
    }

    public int getPresentPassenger() {
        return presentPassenger;
    }

    public void setPresentPassenger(int presentPassenger) {
        this.presentPassenger = presentPassenger;
    }
}

2) Bus

  1. Vehicle을 상속하고, 버스의 기본 요금을 의미하는 field fare 선언.
  2. Enum BusAgePolicy와 연동하여 연령에 따른 버스 요금이 산정되도록 설계.
  3. constructor는 차량번호, 기본요금, 운행 상태, 최대 승객 수를 초기화하도록 설계.
package domain;

public class Bus extends Vehicle{
    // field
    private int fare;

    // constructor
    public Bus(int number){
        super();
        this.setNumber(number);
        this.setFare(1000);
        this.setStatus(true);
        this.setMaxPassenger(30);
    }

    public int getFare() {
        return fare;
    }

    public void setFare(int fare) {
        this.fare = fare;
    }
}

3) Taxi

  1. Vehicle을 상속하고, Taxi의 요금 산정에 필요한 field Stirng destination, int distanceToDestination, int basicFare, int basicDistance, int distanceFare, int AccumulatedFare 선언.
  2. constructor는 최대 승객 수, 기본 요금, 거리에 따른 추가 요금, 추가 거리, 택시 번호, 매출 합계, 운행 상태를 초기화 하도록 설계.
package domain;

public class Taxi extends Vehicle{
    // field
    private String destination;
    private int distanceToDestination;
    private int basicFare;
    private int basicDistance;
    private int distanceFare;
    private int AccumulatedFare;



    // constructor
    public Taxi(int number){
        super();
        this.setMaxPassenger(4);
        this.setBasicFare(3000);
        this.setDistanceFare(1000);
        this.setBasicDistance(1);
        this.setNumber(number);
        this.setAccumulatedFare(0);
        this.setStatus(true);
    }

    // getter and setter
    public int getAccumulatedFare() {
        return AccumulatedFare;
    }

    public void setAccumulatedFare(int accumulatedFare) {
        AccumulatedFare = accumulatedFare;
    }
    public String getDestination() {
        return destination;
    }

    public void setDestination(String destination) {
        this.destination = destination;
    }

    public int getDistanceToDestination() {
        return distanceToDestination;
    }

    public void setDistanceToDestination(int distanceToDestination) {
        this.distanceToDestination = distanceToDestination;
    }

    public int getBasicFare() {
        return basicFare;
    }

    public void setBasicFare(int basicFare) {
        this.basicFare = basicFare;
    }

    public int getBasicDistance() {
        return basicDistance;
    }

    public void setBasicDistance(int basicDistance) {
        this.basicDistance = basicDistance;
    }

    public int getDistanceFare() {
        return distanceFare;
    }

    public void setDistanceFare(int distanceFare) {
        this.distanceFare = distanceFare;
    }
}

2. service class

1) interface RunService

대중 교통이 공통적으로 필요한 기능을 default로 정의. 요금 산정 method의 경우 각 대중 교통마다 요금을 산정하는 방식이 상이하므로, 선언만 하였음.

package service;

import domain.Vehicle;

public interface RunService {
    default void runStart(Vehicle vehicle){
        vehicle.setStatus(true);
    }
    default void changeSpeed(Vehicle vehicle, int speed){
        if(vehicle.getFuel() < 10){
            System.out.println("주유 필요");
            return;
        }
        if(speed < 0){
            speed = 0;
        }
        vehicle.setSpeed(speed);
    }
    default void changeStatus(Vehicle vehicle, boolean status){
        if(status){
            vehicle.setStatus(status);
            return;
        }
        vehicle.setStatus(status);
        vehicle.setPresentPassenger(0);
    }
    default void passengerRide(Vehicle vehicle, int num){
        if (vehicle.getPresentPassenger() + num > vehicle.getMaxPassenger()){
            System.out.println("최대 승객 수를 초과하여 탑승할 수 없습니다.");
            return;
        }
        vehicle.setPresentPassenger(vehicle.getPresentPassenger()+num);
    }
    default void changeFuel(Vehicle vehicle, int num){
        int tmp = vehicle.getFuel() + num;
        if (tmp < 0){
            tmp = 0;
        }
        vehicle.setFuel(tmp);
        if (tmp < 10){
            vehicle.setStatus(false);       // 연료가 없으면 상태 변경(운행 종료)
            System.out.println("주유 필요");
        }
    }
    String passengerInfo(Vehicle vehicle);
}

2) BusRunService

  1. 버스의 승객 상태(여유, 혼잡 보통)을 산출하는 method passengerInfo(Vehicle vehicle) 선언
  2. 버스의 요금을 계산하는 method int fareCalc(Bus bus, int[] arr) 선언
package service;

import domain.Bus;
import domain.BusAgePolicy;
import domain.Vehicle;

public class BusRunService implements RunService{
    @Override
    public String passengerInfo(Vehicle vehicle) {
        double tmp = (double) vehicle.getPresentPassenger() / vehicle.getMaxPassenger();
        if (tmp > 0.8){
            return "혼잡";
        }
        if (tmp < 0.2){
            return "여유";
        }
        return "보통";
    }

    public int fareCalc(Bus bus, int[] arr){
        int result = 0;
        for (int i = 0; i < arr.length; i++) {
            BusAgePolicy busAgePolicy = BusAgePolicy.of(arr[i]);
            result = result + busAgePolicy.calculateFareAppliedAgePolicy(bus.getFare());
        }
        return result;
    }
}

3) TaxiRunService

  1. 택시 백미러에 위치한 LED의 상태를 산출하는 String passengerInfo(Vehicle vehicle) 선언
  2. 택시의 운임을 계산하는 int fareCalc(Taxi taxi) 선언
  3. 택시 요금을 계산할 때, 택시의 상태를 빈 차로 바꾸고, 매출 총액을 계산하는 method void payment(Taxi taxi, int fare) 선언
package service;

import domain.Taxi;
import domain.Vehicle;

public class TaxiRunService implements RunService{
    @Override
    public String passengerInfo(Vehicle vehicle) {
        if (vehicle.getPresentPassenger() > 0){
            return "LED Off";
        }
        return "빈 차";
    }

    public int fareCalc(Taxi taxi){
        int result = taxi.getBasicFare();
        // 택시 추가 요금이 버림인가 올림인가 모르겠음... 일단 버림으로 계산
        result = result + (taxi.getDistanceToDestination() - taxi.getBasicDistance()) * taxi.getDistanceFare();
        return result;
    }
    public void payment(Taxi taxi, int fare){
        taxi.setAccumulatedFare(taxi.getAccumulatedFare() + fare);
        taxi.setPresentPassenger(0);
    }
}

0개의 댓글