자동차 만들기 종합 - 실습문제

hovi·2023년 5월 30일
0

JAVA

목록 보기
15/36

클래스 설계

클래스 정의

  • 자동차를 상속 받아 승용차, 스포츠카, 버스, 만들기
  • 자동차의 필드는 자동차에서 정의 해서 상속을 줌
  • 자동차는 상속용 차이며 운행 하지 않는 자동차 입니다

자동차

자동차는 객체화가 안되므로 추상화 하는게 좋을 것 같습니다.

구현해야 할 공통의 메소드는 기본 자동차 클래스에서 구현해서 상속주는 것도 좋은 방법 입니다.

  • 속도
  • 연비
  • 연료탱크 크기
  • 좌석수
  • 차량이름

스포츠카

  • 연비 : 8km
  • 속도 : 250km
  • 연료 탱크 크기 : 30 리터
  • 좌석수 : 2
  • 차량이름은 생성자에서 입력 받아서 설정
  • 부가기능 : 터보기능 (켜면 속도 20% 향상)

승용차

  • 연비 : 12km
  • 속도 : 200 km
  • 연료 탱크 크기 : 45 리터
  • 좌석수 : 4
  • 차량이름은 생성자 입력 받아서 설정
  • 부가기능 : 트렁크 (켜면 승객 1명 추가)

버스

  • 연비 : 5km
  • 속도 : 150km
  • 연료탱크 크기 : 100리터
  • 좌석수 : 20
  • 차량이름은 입력 생성자 받아서 설정
  • 부가기능 : 보조연료탱크(켜면 연료탱크 크기가 30리터 늘어남)

설정 정보

기본 설정

  • 기름값은 1리터당 2000원
  • 연비란? 리터당 주행거리를 의미 합니다.
  • 부산 400km, 강릉 200km, 대전 150km, 광주 300km
  • 처음 출발시 연료통에는 기름이 없는 상태 입니다.

기능 구현

  • 이동 지역을 선택 하세요 (1. 부산, 2. 대전, 3. 강릉, 4. 광주)
  • 이동할 승객 수를 입력 하세요 ( 1 ~ 100 사이)
  • 이동 차량을 선택 하세요. (1. 스포츠카, 2.승용차, 3번 버스)
  • 부가 기능의 ON/OFF 를 선택 하세요.

결과 출력

  • 차량 이름 표시

  • 이동에 필요한 총 비용 산출(정수표시) : (단, 이동 횟수는 편도만 계산하면 됩니다.)

  • 주유 횟수(정수표시) : ****

  • 총 시간 계산 ( 시간단위로 표시하되 소수점 이라 2자리까지 표시) :

  • 코드 보기

    CarTotalMain

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

    Car

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

    SportsCar

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

    Sedan

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

    Bus

    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;
        }
    }
profile
풀스택 예비 개발자

0개의 댓글