클래스에 대해 공부해서 다음과 같은 요구사항에 대한 Bus와 Taxi에 대한 클래스를 설계하고 생성하여 깃헙url로 제출

  1. 아래의 정보를 가지는 ‘Bus’ 클래스 모델링
    • 포함해야 할 정보
      1. 최대 승객수
      2. 현재 승객수
      3. 요금
      4. 버스 번호
      5. 주유량
      6. 현재 속도
      7. 상태
        1. 운행, 차고지 행
    • 기능
      1. 운행
      2. 버스 상태 변경
      3. 승객 탑승
      4. 속도 변경
    요구사항
    • 버스 번호
      • 버스 객체 생성시 번호는 고유값으로 생성되어야 합니다.
    • 버스 상태 변경
      • 버스 객체 생성시 최초 상태는 ‘운행’ 상태가 되며
      • 주유량이 떨어지거나, 운행을 종료할 때 ‘차고지행’ 상태로 변경 합니다.
      • 10미만일 경우 ‘주유가 필요하다’는 메시지를 출력해 주세요
    • 승객 탑승
      • 승객 탑승은 ‘최대 승객수’ 이하까지 가능하며 **‘운행 중’**인 상태의 버스만 가능합니다.
      • 탑승시 현재 승객수가 증가되어야 합니다.
    • 속도 변경
      • 주유 상태를 체크하고 주유량이 10 이상이어야 운행할 수 있습니다.
        • 경고메시지
          • 주유량을 확인해 주세요.
          • print문으로 출력
      • 변경할 속도를 입력 받아 현재 속도에 추가 하거나 뺄 수 있어야 합니다.
  2. 아래의 정보를 가지는 ‘Taxi’ 클래스 모델링
    • 포함해야 할 정보
      1. 택시 번호
      2. 주유량
      3. 현재속도
      4. 목적지
      5. 기본거리
      6. 목적지까지 거리
      7. 기본 요금
      8. 거리당 요금
      9. 상태 (운행 중, 일반, 운행불가)
    • 기능
      1. 운행시작
      2. 승객 탑승
      3. 속도 변경
      4. 거리당 요금 추가
      5. 요금 결제
    • 요구 사항
      • 운행 시작
        • 운행 시작전 주유상태를 체크 하고 주유량이 10 이상이어야 운행 가능
      • 승객탑승
        • 승객 탑승은 택시 상태가 ‘일반'일 때만 가능합니다.
        • 그 외 택시는 ‘탑승 불가’ 처리를 해주세요.
        • ‘일반’ 상태의 택시가 승객을 태우면 ‘운행 중’ 상태로 변경해 주세요
      • 속도 변경
        • 변경할 속도를 입력 받아 현재 속도에 추가 하거나 뺄 수 있어야 합니다.
      • 거리당 요금 추가
        • 기본 거리보다 먼 곳은 추가 요금이 붙습니다.
        • 기본 거리와 추가 요금은 자유롭게 산정해 주세요
      • 요금 결제
        • 최종 요금을 출력하는 것으로 합니다.

 

 


 

따로따로 클래스를 만들려다가 시나리오에서 상위클래스로 교통수단을 묶어 클래스를 만든걸 보고

상속 클래스를 사용해보고 싶어서 상위 클래스를 만들었다. 공통부분을 상위클래스에 두고 하위 클래스로 taxi와 bus를 나누어 만들었다. 그리고 실행은 또 별도의 main함수를 두어 실행하는 구조로 진행

 

상위 클래스인 Transportation ) 

package assignment_class_modeling;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Transportaion {
    String num;		// 차량번호 고유번호
    int baseRate;       // 기본요금
    int refuelAmount;   // 주유량
    int nowSpeed;       // 지금 속력
    int stateNum;       // 지금 상태 0: 운행불가, 1: 운행가능, 2:제3의상태
    String state;

    // 생성자
    public Transportaion (int refuelAmount){
        this.refuelAmount = refuelAmount;
        stateNum = 1;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        Calendar dateTime = Calendar.getInstance();
        num = sdf.format(dateTime.getTime());
    }

    // 운행 시작
    public void run(){
        if(refuelAmount < 10){
            stateNum = 0;
        } else {
            stateNum = 1;
        }
    }

    // 상태변경 메소드 : 0: 운행불가, 1: 운행가능, 2:제3의상태
    public void stateChange(int x){
        if(x == 1){
            if(refuelAmount < 10){
                System.out.println("주유가 필요합니다");
                stateNum = 0;
            } else {
                stateNum = 1;
            }
        } else {
            stateNum = x;
        }
    }

    // 승객 탑승
    public void passengerRiding(){

    }

    // 속력변경 메소드 : Operator = '-','+'
    public void speedChange(char operator, int speed){
        if( stateNum != 0 && refuelAmount >= 10){
            if(operator == '+') nowSpeed += speed;
            if(operator == '-') nowSpeed -= speed;
        } else if (refuelAmount < 10){
            System.out.println("주유량을 확인해 주세요.");
        }
    }
}

 

하위클래스 1 : Bus ) 

package assignment_class_modeling;

public class Bus extends Transportaion {
    int maxPassengerCnt;		// 탑승가능 인원수
    int nowPassengerCnt;		// 현재 인원수
    int remainingSeat;			// 남은 자리
    String[] stateStr = {"차고지행","운행"};

    // 생성자
    public Bus(int refuelAmount){
        super(refuelAmount);
        state = stateStr[stateNum];

        maxPassengerCnt = 30;
        remainingSeat = 30;
        nowPassengerCnt = 0;
    }

    // 운행 시작
    public void run(){
        super.run();
        state = stateStr[stateNum];
    }

    // 상태변경 메소드 : 0: 운행불가, 1: 운행가능
    public void stateChange(int x){
        super.stateChange(x);
        state = stateStr[stateNum];
    }

    // 승객 탑승
    public void passengerRiding(int personCnt){
        if(stateNum == 1){
            if(maxPassengerCnt > (nowPassengerCnt + personCnt)){
                nowPassengerCnt += personCnt;
                remainingSeat = maxPassengerCnt - nowPassengerCnt;
            } else {
                System.out.println("최대 승객 수가 초과하여 탑승할 수 없습니다.");
            }
        }
    }

    // 속력변경 메소드 : Operator = '-','+'
    public void speedChange(char operator, int speed){
        super.speedChange(operator, speed);
    }

}

 

하위클래스 2 : Taxi ) 

package assignment_class_modeling;

public class Taxi extends Transportaion {
    String destination;
    int basDistance = 3; 		// 기본 거리 3km
    int distanceToDestination;		// 목적지까지 거리
    int perDistanceRate = 200;  	// 거리당 요금
    int sumDistanceRate;           	// 거리요금 총합
    String[] stateStr = {"운행불가", "일반", "운행중"};

    // 생성자
    public Taxi (int refuelAmount){
        super(refuelAmount);

        if(refuelAmount < 10){
            stateNum = 0;
        }
        state = stateStr[stateNum];

        baseRate = 3300;
    }

    // 운행 시작
    public void run(){
        super.run();
        state = stateStr[stateNum];
    }

    // 상태변경 메소드 : 0: 운행불가, 1: 운행가능, 2:제3의상태
    public void stateChange(int x){
        super.stateChange(x);
        state = stateStr[stateNum];
    }

    // 승객 탑승
    public void passengerRiding(){
        if(stateNum == 1){
            stateNum = 2;
            state = stateStr[stateNum];
        } else {
            System.out.println("탑승 불가 입니다");
        }
    }

    // 속력변경 메소드 : Operator = '-','+'
    public void speedChange(char operator, int speed){
        super.speedChange(operator, speed);
    }

    // 거리당 요금 추가 메소드
    public void plusPerRate(String destination, int distanceToDestination){
        this.destination = destination;
        System.out.println("목적지 : "+this.destination);
        if(distanceToDestination > basDistance){
            sumDistanceRate =  perDistanceRate = (distanceToDestination - basDistance) * perDistanceRate;
        }
    }

    // 최종 요금 출력 메소드
    public void finalRateCaculate (){
        int finalRate = baseRate + sumDistanceRate;
        System.out.println("최종 요금은 " + finalRate + "원 입니다");
    }
}

 

실행클래스 Main ) 

package assignment_class_modeling;

public class Main {
    public static void main(String[] args) {

        System.out.println("--------------------------------버스 객체 생성");
        Bus bus1 = new Bus(100);
        System.out.println("버스1 상태: " + bus1.state);
        System.out.println("버스1 번호: " + bus1.num);
        Bus bus2 = new Bus(5);
        System.out.println("버스2 상태: " + bus2.state);
        System.out.println("버스2 번호: " + bus2.num);

        System.out.println("--------------------------------버스 상태 변경");
        bus1.stateChange(0);
        System.out.println("버스 상태: " + bus1.state);
        bus1.run();
        System.out.println("run() 이후 버스상태: " + bus1.state);

        System.out.println("--------------------------------버스 승객 탑승");
        bus1.passengerRiding(13);
        System.out.println("현재 탑승자 수: " +bus1.nowPassengerCnt);
        System.out.println("현재 여유석 수: " +bus1.remainingSeat);
        bus1.passengerRiding(20);
        System.out.println("현재 탑승자 수: " +bus1.nowPassengerCnt);
        System.out.println("현재 여유석 수: " +bus1.remainingSeat);


        System.out.println("--------------------------------버스 속도 변경");
        bus1.speedChange('+', 100);
        System.out.println("버스 현재속력: " + bus1.nowSpeed);
        bus1.speedChange('-', 40);
        System.out.println("버스 현재속력: " + bus1.nowSpeed);

        System.out.println("--------------------------------택시 객체 생성");
        Taxi taxi = new Taxi(100);
        System.out.println("택시 상태: " + taxi.state);
        System.out.println("택시 번호: " + taxi.num);

        System.out.println("--------------------------------택시 상태 변경");
        taxi.stateChange(0);
        System.out.println("택시 상태: " + taxi.state);
        taxi.run();
        System.out.println("run() 이후 택시상태: " + taxi.state);
        taxi.stateChange(2);
        System.out.println("택시 상태: " + taxi.state);
        taxi.stateChange(1);
        System.out.println("택시 상태: " + taxi.state);

        System.out.println("--------------------------------택시 승객 탑승");
        taxi.passengerRiding();
        System.out.println("택시 상태: " + taxi.state);

        System.out.println("--------------------------------택시 속도 변경");
        taxi.speedChange('+', 150);
        System.out.println("택시 현재속력: " + taxi.nowSpeed);
        taxi.speedChange('-', 100);
        System.out.println("택시 현재속력: " + taxi.nowSpeed);

        System.out.println("--------------------------------택시 거리당 요금 추가");
        taxi.plusPerRate("서울", 74);
        System.out.println("목적지 " + taxi.destination + "까지 거리당 추가 요금은 " + taxi.sumDistanceRate + "원 입니다." );

        System.out.println("--------------------------------택시 최종 요금");
        taxi.finalRateCaculate();

        System.out.println("종료");
    }
}

 

 

깃헙 주소: 

 

GitHub - littlezero48/sparta_assignment: 항해99 숙제

항해99 숙제. Contribute to littlezero48/sparta_assignment development by creating an account on GitHub.

github.com

 

 

 

더 나은 개선을 위해 참고하라고 주신 링크들:

 

생각하라, 객체지향처럼 | 우아한형제들 기술블로그

{{item.name}} 2년차 쪼랩이가 객체지향을 처음으로 접하고 공부를 하면서 나름대로 정리해보았습니다. 시작 인사 안녕하세요. B2B시스템개발팀 김승영입니다. 먼저, 이 글은 지난 02월에 작성되어

techblog.woowahan.com

 

객체지향(OOP)과 절차적 프로그래밍(PP)

오늘은 프로그래밍에서 중요한 개념 중 하나인 객체지향 프로그래밍(Object Oriented Programming)과 절차적 프로그래밍(Procedure Programming)에 대해 알아보고자 합니다. 대개 객체지향 프로그래밍 언어를

st-lab.tistory.com

 

(Java) 21 - 객체 지향 예제 - 학생, 버스, 지하철 프로그램

객체 지향 프로그래밍에 대해 배운 것들을 사용해 학생, 버스, 지하철 세 가지의 객체가 서로 상호작용하는 것을 프로그래밍 한 예제다. package classpart; public class Student { String name; int money; public St

dogrushdev.tistory.com

 

OCP(Open Closed Principle)이란?

 

nesoy.github.io

 

090 OOP-예제로시작하기-01 객체와 클래스(Object & Class)

#파이썬 #python #객체_지향 #oop #object_oriented_programming #class #object #클래스 #오브젝트 #객체 ...

blog.naver.com

 

자바의 추상 클래스와 인터페이스

추상 클래스와 인터페이스의 차이 | 추상 클래스(Abstract class)와 인터페이스(Interface)의 차이 및 존재 이유를 설명해주세요. 클래스는 크게 일반 클래스와 추상 클래스로 나뉘는데 추상 클래스는

brunch.co.kr

 

 

+ Recent posts