인터넷 강의 정리용
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 |
댓글