Back-End/Java

[Java] 대중교통 요금 관리 프로그램 만들어보기

nanee_ 2021. 9. 2. 13:29
728x90
반응형
SMALL

대중교통 클래스

 

 

- 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함수가 있는 클래스이다.

모든 메서드들이 잘 구현되고 있는지 확인을 해 보았다.

 

 

 

 

 

 

 

728x90
반응형
LIST