[Java] 대중교통 요금 관리 프로그램 만들어보기
대중교통 클래스
- PublicTransportation.java
public abstract class PublicTransportation {
// 멤버변수
protected int number; // 버스(번호), 지하철(호선)
protected int passengerCnt; // 승객수
protected int income; // 수입
// 승차 메서드
public void take(int money) {
this.income += money;
passengerCnt++;
}
// 정보 출력 메서드
public abstract void showInfo();
}
Bus, Subway 클래스들의 상위클래스이다.
공통으로 사용되는 take() 메서드를 만들어 주었다.
showInfo()는 각 하위클래스마다 구성이 조금 다르기 때문에 추상메서드로 선언했다.
- Bus.java
public class Bus extends PublicTransportation {
// 요금
final int ADULTFEE = 1350;
final int STUDENTFEE = 1100;
// 생성자
public Bus(int busNumber) {
super.number = busNumber;
}
// 정보 메서드
@Override
public void showInfo() {
System.out.println("==="+number + "번 버스 정보 ===");
System.out.println("승객은 " + passengerCnt + "명 입니다.");
System.out.println("수입은 " + income + "원 입니다.");
System.out.println("===============");
}
}
성인, 학생별로 요금을 상수로 초기화해주었다.
showInfo() 메서드를 재정의 해주었다.
- Subway.java
public class Subway extends PublicTransportation {
// 요금
final int ADULTFEE = 1450;
final int STUDENTFEE = 1200;
// 생성자
public Subway(int lineNumber) {
this.number = lineNumber;
}
// 정보 출력 메서드
@Override
public void showInfo() {
System.out.println("==="+number + "호선 지하철 정보 ===");
System.out.println("승객은 " + passengerCnt + "명 입니다.");
System.out.println("수입은 " + income + "원 입니다.");
System.out.println("===============");
}
}
성인, 학생별로 요금을 상수로 초기화해주었다.
showInfo() 메서드를 재정의 해주었다.
승객 클래스
- Passenger.java
public abstract class Passenger {
// 멤버변수
protected String name;
protected int age;
protected int money; //잔액
// 생성자
public Passenger(String name, int age) {
this.name = name;
this.age = age;
this.money = 0;
}
// 요금 충전 메서드
public void topUpMoney(int money) {
this.money += money;
System.out.println(money+"원이 충전되었습니다.");
}
// 추상메서드
public abstract void takeBus(PublicTransportation bus);
public abstract void takeSubway(PublicTransportation subway);
public abstract void showInfo();
}
Adult와 Student의 상위 클래스이다.
하위 클래스들의 공통 기능인 요금 충전 메서드 topUpMoney를 만들었다.
추상메서드로 takeBus, takeSubway, showInfo를 선언했다.
위 세개의 메서드들은 하위 클래스마다 받아오는 변수와, 구성이 조금씩 다르기 때문에 추상메서드로 선언했다.
- Audult.java
public class Adult extends Passenger {
public Adult(String name, int age) {
super(name, age);
}
// 버스 승차 메서드
@Override
public void takeBus(PublicTransportation bus) {
int fee = ((Bus)bus).ADULTFEE;
if(this.money < fee) {
System.out.println("잔액이 부족합니다. 충전이 필요합니다.");
}else {
bus.take(fee); // 버스 요금
money -= fee; // 잔액 차감
System.out.println("성인입니다.");
System.out.println(fee + "원이 결제되었습니다.");
}
}
// 지하철 승차 메서드
@Override
public void takeSubway(PublicTransportation subway) {
int fee = ((Subway)subway).ADULTFEE;
if(this.money < fee) {
System.out.println("잔액이 부족합니다. 충전이 필요합니다.");
}else {
subway.take(fee); // 지하철 요금
this.money -= fee; // 잔액 차감
System.out.println("성인입니다.");
System.out.println(fee + "원이 결제되었습니다.");
}
}
@Override
public void showInfo() {
System.out.println(name + " 님 정보 ==========");
System.out.println("성인 입니다.");
System.out.println("잔액은 " + money + "원 입니다.");
System.out.println("===================");
}
}
추상메서드들을 재구현 했다.
Bus, Subway에 있는 상수를 가져오기 위해서 다운캐스팅을 사용했다.
상위 클래스인 PublicTransportaion 타입으로 받아오기 때문에 하위클래스 Bus, Subway이라고 명시를 해 주어야 했다.
- Student.java
public class Student extends Passenger {
public Student(String name, int age) {
super(name, age);
}
// 버스 승차 메서드
public void takeBus(PublicTransportation bus) {
int fee = ((Bus)bus).STUDENTFEE;
if(this.money < fee) {
System.out.println("잔액이 부족합니다. 충전이 필요합니다.");
}else {
bus.take(fee); // 버스 요금
this.money -= fee; // 잔액 차감
System.out.println("학생입니다.");
System.out.println(fee + "원이 결제되었습니다.");
}
}
// 지하철 승차 메서드
@Override
public void takeSubway(PublicTransportation subway) {
int fee = ((Subway)subway).STUDENTFEE;
if(this.money < fee) {
System.out.println("잔액이 부족합니다. 충전이 필요합니다.");
}else {
subway.take(fee); // 지하철 요금
this.money -= fee; // 잔액 차감
System.out.println("학생입니다.");
System.out.println(fee + "원이 결제되었습니다.");
}
}
@Override
public void showInfo() {
System.out.println("-----"+name + " 의 정보 -----");
System.out.println("청소년 입니다.");
System.out.println("잔액은 " + money + "원 입니다.");
System.out.println("------------------------");
}
}
Student 클래스도 마찬가지로 다운캐스팅을 활용해 요금 변수를 가져왔다.
등록 클래스
- Register.java
public class Register {
public static int adultCnt;
public static int studentCnt;
private int registerId;
private String name;
public Register(int id) {
this.registerId = id;
this.name = "이용자 등록";
}
// 사용자 등록 메서드
public Passenger register(String name, int age) {
if(age >= 20) {
adultCnt++;
System.out.println("등록이 완료되었습니다.");
System.out.println("충전이 필요합니다.");
return new Adult(name, age);
}else {
studentCnt++;
System.out.println("등록이 완료되었습니다.");
System.out.println("충전이 필요합니다.");
return new Student(name, age);
}
}
}
Resgister 클래스는 사용자 등록의 기능을 가진다.
age 변수를 활용해 if문으로 성인과 학생을 나누어주었고,
return에 new키워드를 사용해 객체를 생성해준다.
adultCnt, studentCnt는 static으로 순서가 생기게 되는데,
이 변수들을 사용해서 등록되는 명 수를 담아줄 수있다.
이 코드에서는 선언만 해 두고 사용을 하지 않았지만,
여러 기능을 담을 수있다고 기록해두고 싶었다.
MainTest 클래스
- TakeTransMainTest.java
public class TakeTransMainTest {
public static void main(String[] args) {
// 인스턴스화
PublicTransportation bus168 = new Bus(168);
PublicTransportation subway1 = new Subway(1);
Register register = new Register(1);
Passenger passenger1 = register.register("승객1", 16);
passenger1.topUpMoney(5_000);
Passenger passenger2 = register.register("승객2", 25);
passenger2.topUpMoney(7_000);
// passenger1
passenger1.takeBus(bus168);
passenger1.takeSubway(subway1);
passenger1.takeSubway(subway1);
passenger1.takeBus(bus168);
passenger1.takeBus(bus168);
// passenger2
passenger2.takeSubway(subway1);
passenger2.takeSubway(subway1);
passenger1.showInfo();
passenger2.showInfo();
bus168.showInfo();
subway1.showInfo();
}
}
만들어 놓은 메서드들을 구현할 수 있는 main함수가 있는 클래스이다.
모든 메서드들이 잘 구현되고 있는지 확인을 해 보았다.