Small Grey Outline Pointer [Java] TMS 대중교통 터미널 시스템 만들기
본문 바로가기
Dev./java

[Java] TMS 대중교통 터미널 시스템 만들기

by sso. 2022. 6. 17.

인터넷 강의 정리용

 

 

 

 

public.java

package tms;
//pay() : 요금을 정산할 수 있는 메서드
//showDestMsg(String destination) : 도착시 "도착지에 도착했습니다" 메세지 출력하는 메서드
//자식클래스 : 버스, 지하철

//view
//이용하실 대중 교통을 선택하세요
//출발지는 랜덤
//도착지는 버튼으로 구현 (optionDialog())
//출발지와 도착지가 같지 않도록 구현
//버스는 정방향만 가능
//지하철은 역방향도 가능
//교대 > 강남 > 역삼 > 선릉


public abstract class Public {
	String[] arStation = {"교대", "강남", "역삼", "선릉"};
	
	//추상 메서드로 만든 이유: 대중교통이라면 무조건 이 두가지를 만들어야 된다는 강제성 위해서
	abstract int pay(int money); //외부에서 pay 받아오기
	abstract void showDestMsg(String destination);
	//대중교통이 움직이기 위해서는 외부에서 내가 선택한 버튼의 인덱스번호를 넘겨받아야함
	//즉, 맨처음에 도착지를 버튼으로 선택. 0번째부터 n번째 까지 있다면, 클릭한 버튼의 인덱스 번호를 가져와야 도착지를 설정할 수 있다
	abstract String go(int btnIndex, int money); 
}

 

 

Bus.java

package tms;

import java.util.Random;

import javax.swing.JOptionPane;

public class Bus extends Public{
	int fee = 1200; //버스 요금

	@Override
	int pay(int money) {
		money -= fee;
		return money;
	}
	
	@Override
	String go(int btnIndex, int money) {
		//출발지와 도착지가 같은지 확인해주고
		//정방향인지 역방향인지 생각해서 for문 돌아야 한다 시작점을 length -1 부터 할건지 0부터 할건지, 도착지부터? 출발지부터? 
		//btnIndex : 도착지 
		//index : 출발지
		int cnt = 0;
		int index=0;
		String result="";
		Random r = new Random();
		
		while(true) {
			index = r.nextInt(arStation.length);
			//버스가 정방향으로 이동하므로, 도착지 인덱스가 출발지 인덱스보다 커야 조건이 성립된다
			if(btnIndex > index) break;
		}
		cnt = btnIndex - index;
		
		if(money - fee < 0) {
			result ="잔액부족,";
		}else {
			//정류장을 for문으로 돌 때의 조건은 잔액부족이 아닐 경우에 해당
			result = "" + pay(money) +",";
			result += arStation[index]+">";
										
			for (int i = 0; i < cnt; i++) {
				result += i == cnt-1 ? arStation[index+i+1] : arStation[index+i+1]+">";
			}
			showDestMsg(arStation[btnIndex]); 
		}
		return result;
	}

	@Override
	void showDestMsg(String destination) {
		JOptionPane.showMessageDialog(null, destination+ "에 도착했습니다");
	}
	
	
}

 

subway.java

package tms;

import java.util.Random;

import javax.swing.JOptionPane;

public class Subway extends Public {
	
	int fee = 1200; //버스 요금
	
	
	@Override
	int pay(int money) {
		money -= fee;
		return money;
	}
	
	@Override
	String go(int btnIndex, int money) {
		//출발지와 도착지가 같은지 확인해주고
		//정방향인지 역방향인지 생각해서 for문 돌아야 한다 시작점을 length -1 부터 할건지 0부터 할건지, 도착지부터? 출발지부터? 
		//btnIndex : 도착지 
		//index : 출발지
		int cnt = 0;
		int index=0;
		String result="";
		Random r = new Random();
		
		while(true) {
			index = r.nextInt(arStation.length);
			//지하철은 양방향 가능하므로, 같지만 않으면 된다
			if(btnIndex != index) break;
		}
		cnt = btnIndex - index;
		
				if(money - fee < 0) {
					result ="잔액 부족,";
				}else {
					//정류장을 for문으로 돌 때의 조건은 잔액부족이 아닐 경우에 해당
					result = "" + pay(money) +",";
					result += arStation[index]+">";
					if(cnt > 0) {
						for (int i = 0; i < cnt; i++) {
							//index : 출발지
							result += i == cnt-1 ? arStation[index+i+1] : arStation[index+i+1]+">";
							
						}
						showDestMsg(arStation[btnIndex]); 
					}else {
						cnt *= -1;
						for (int i = 0; i < cnt; i++) {
							result += i == cnt-1 ? arStation[index-i-1] : arStation[index-i-1]+">";
							//i == cnt-1 ? 지금이 마지막 반복인가?
						}
						showDestMsg(arStation[btnIndex]); 
					}
				}
				return result;
			}

	@Override
	void showDestMsg(String destination) {
		JOptionPane.showMessageDialog(null, destination + "에 도착했습니다");
	}
}

 

Road.java //뷰단

package tms;

import javax.swing.JOptionPane;

//view단 구성하기
public class Road {
	
	void view() {
		int money = 20000;
		//int money = 1000; //잔액부족 설정 테스트
		
		//public에 있는 arStation을 버튼으로 만들기. 객체화 시켜준다
		Bus bus360 = new Bus();
		Subway line2 = new Subway();
		
		String[] arName= {"bus","subway"};
		String[] result = new String[2]; //돈과 결과밖에 없으므로 2칸 짜리 배열 생성		
		
		while(true) {
			//사용자가 선택한 번호 int 
			int choice = JOptionPane.showOptionDialog(null, "대중교통을 선택하세요", "TMS", 
					JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, arName, null);
			if(choice == -1) break; //x버튼일 때 나가기
			
			//대중교통을 선택하고, 나가기를 안눌렀을 때 나오는 메세지
			int btnIndex=JOptionPane.showOptionDialog(null, "도착지를 선택하세요","TMS", 
					JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, bus360.arStation, null);
			
			if(btnIndex == 0 && choice ==0) {
				JOptionPane.showMessageDialog(null, "도착지는 교대 다음 정류장부터 가능합니다");
				continue;
			}
			switch(choice) {
			//bus 눌렀을 때
			case 0 :
				//go의 리턴타입이 String이므로 split 쉼표로 구분점 짓기
				result = bus360.go(btnIndex, money).split(",");
				//result의 0번째 방이 "잔액부족" 과 같다면
				if(result[0].equals("잔액부족")) {
					JOptionPane.showMessageDialog(null, "잔액이 부족합니다");
				}else {
					//money = Integer.parseInt(result[0]); //오류!!!!!!!!
					money = Integer.parseInt(result[0]);
					JOptionPane.showMessageDialog(null,"남은잔액: " + money + "원\n" + result[1]);
				}
				break;
				
			case 1 :
				result = line2.go(btnIndex, money).split(",");
				//result의 0번째 방이 "잔액부족" 과 같다면
				if(result[0].equals("잔액부족")) {
					JOptionPane.showMessageDialog(null, "잔액이 부족합니다");
				}else {
					money = Integer.parseInt(result[0]);
					JOptionPane.showMessageDialog(null,"남은잔액: " + money + "원\n" + result[1]);
				}
				break;
			}	
		}
	}
	public static void main(String[] args) {
		new Road().view(); //오류!!!!!!!!!!
	}
}

 

 

 

교대출발 역삼도착

 

 

그런데 중간부터 잔액부족 기능이 구현되지 않아서 구글링으로 오류 해결해보기로 했다

 

 

 

구글링으로 java.lang.numberformatexception for input string 검색해서 어디서 문제가 생기는지 찾아봤다

 

 

문자열 안에 공백이 있어서 스페이스 없애주고 저장 후 다시 실행 시켰더니 잔액부족 기능이 잘 구현되었다

 

728x90

'Dev. > java' 카테고리의 다른 글

Java :: 추상클래스 & 인터페이스  (0) 2022.07.03
Java :: 인터페이스  (0) 2022.07.03
Java 추상 클래스  (0) 2022.06.12
Java :: 다형성/ 싱글턴 패턴  (0) 2022.06.12
Java Casting/instance of  (0) 2022.06.11

댓글