Train Reservation
MainApplication
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import trainReservation.dto.GetTrainListDto;
import trainReservation.entity.Cost;
import trainReservation.entity.Seat;
import trainReservation.entity.StopStation;
import trainReservation.entity.Train;
public class MainApplication {
//Entity에 있는 자료 ctrl + space 해서 import 해주면 오류 안뜸
private static List<Train> trains = new ArrayList<Train>();
private static List<Cost> costs = new ArrayList<Cost>();
public static void main(String[] args) { //메인 메서드에서 쓸거니까 static으로
initData();//호출
// System.out.println(trains.toString());
// System.out.println(costs.toString());
// System.out.println("Run Test");
//출발 대구 -> 도착 대전 하는 열차 찾기
//열차 2개중 어떻게 구별하는가 (기본 전제조건은 순차적 데이터!)
//대구역의 인덱스 1 번 그 다음 대전역 찾음 이때
//대전역인덱스가 대구인덱스보다 다음이면 대구 -> 대전으로 가는 방향이고
// 이전이면 대전 -> 대구 가는 방향이다
//대구역 출발시간을 찾고, 대전역을 찾은 다음 출발시간이
//대구 출발시간보다 이후면 대구 -> 대전 으로 가는 방향
// 이전이면 대전 -> 대구 방향
//기능을 수행하더라도 메인 메서드가 종료가 되지 않도록 만들어주기
//(다시 처음으로 돌아가기)
while(true) {
// Scanner scanner = new Scanner(System.in);
//DTO : data Transfer Object
//레이어 간 데이터를 전송할 때 사용하는 객체
GetTrainListDto dto = new GetTrainListDto();
//continue받으면 이 작업 다시 수행
//변수명에 GetTrainListDto 적으면 원래는 안된다!
//서로 다른 계층간에 전송하고자 할때 쓰는 객체 = dto : data transfer object
//메서드에서 사용하는 한 단위 , 한번에 입력해줘야 하는 단위
//입력받은 값을 인스턴스에 넣어주고 있다.
//인스턴스를 생성하고 초기화해주는작업 ->생성자에서 함
//Dto의 기본생성자에 입력해주면 된다 -> 그럼 밑에 적은 주석들을 안보이게 할수있다.
// System.out.print("출발역 : ");
// //String DepartureStation = scanner.nextLine();
// dto.setDepartureStation(scanner.nextLine());
// System.out.println("도착역 : ");
// //String arrivalStation = scanner.nextLine();
// dto.setArrivalStation(scanner.nextLine());
// System.out.println("출발시간 : ");
// //String departureTime = scanner.nextLine();
// dto.setDepartureTime(scanner.nextLine());
// System.out.println("인원 : ");
// //int numberOfPeople = scanner.nextInt();
// dto.setNumberOfPeople(scanner.nextInt());
//입력한 값 확인하기 : 정확한 입력이 왔는지 확인하는게 중요하다!
// System.out.println("출발역 : " + departureStation +
// ", 도착역 : " + arrivalStation +
// ", 출발시간 : " + departureTime +
// ", 인원 : " + numberOfPeople);
//모든 값을 입력했는지 검증하는 과정
if(dto.getArrivalStation().isBlank()||
dto.getDepartureStation().isBlank()||
dto.getDepartureTime().isBlank()) {
System.out.println("모두 입력하세요.");
continue;
}
System.out.println(dto.toString());
}
//모든 프로세스나 메서드 함수에 대해서 공통적으로 적용되는 법칙
//garbage in garbage out 입력값에 대해서 가장 중요하게 봐야한다!
}
//이건 지금 메서드인가? ->위에서 호출했으니까 메서드
private static void initData() {
costs.add(new Cost("부산역", "서울역", 30000));
costs.add(new Cost("부산역", "대전역", 20000));
costs.add(new Cost("부산역", "대구역", 10000));
costs.add(new Cost("대구역", "서울역", 20000));
costs.add(new Cost("대구역", "대전역", 10000));
costs.add(new Cost("대전역", "서울역", 10000));
costs.add(new Cost("서울역", "부산역", 30000));
costs.add(new Cost("서울역", "대전역", 10000));
costs.add(new Cost("서울역", "대구역", 20000));
costs.add(new Cost("대전역", "부산역", 20000));
costs.add(new Cost("대전역", "대구역", 10000));
costs.add(new Cost("대구역", "부산역", 10000));
Train train; //train은 정보입력이 많아서 2개만한다
List<Seat> seats = new ArrayList<>();
List<StopStation> stopStations = new ArrayList<>();
seats.add(new Seat(1,"A1", false));
seats.add(new Seat(1,"B1", false));
seats.add(new Seat(1,"A2", false));
seats.add(new Seat(1,"B2", false));
seats.add(new Seat(2,"A1", false));
seats.add(new Seat(2,"B1", false));
seats.add(new Seat(2,"A2", false));
seats.add(new Seat(2,"B2", false));
seats.add(new Seat(3,"A1", false));
seats.add(new Seat(3,"B1", false));
seats.add(new Seat(3,"A2", false));
seats.add(new Seat(3,"B2", false));
stopStations.add(new StopStation("서울역","", "06:00"));
stopStations.add(new StopStation("대전역","06:45", "07:00"));
stopStations.add(new StopStation("대구역","07:45", "08:00"));
stopStations.add(new StopStation("부산역","09:00", ""));
train = new Train("KTX001", "서울역", "06:00",
"부산역", "09:00", 180, "KTX", stopStations, seats);
//왜 인스턴스생성을 했을까..
//cost는 안했는데 직접입력하는 그건가..? ->cost도 했음
trains.add(train);
//*다시 생성해서 값 넣어주기
seats = new ArrayList<>();
stopStations = new ArrayList<>();
seats.add(new Seat(1,"A1", false));
seats.add(new Seat(1,"B1", false));
seats.add(new Seat(1,"A2", false));
seats.add(new Seat(1,"B2", false));
seats.add(new Seat(2,"A1", false));
seats.add(new Seat(2,"B1", false));
seats.add(new Seat(2,"A2", false));
seats.add(new Seat(2,"B2", false));
seats.add(new Seat(3,"A1", false));
seats.add(new Seat(3,"B1", false));
seats.add(new Seat(3,"A2", false));
seats.add(new Seat(3,"B2", false));
stopStations.add(new StopStation("부산역","", "09:00"));
stopStations.add(new StopStation("대구역","09:45", "10:00"));
stopStations.add(new StopStation("대전역","10:45", "11:00"));
stopStations.add(new StopStation("서울역","12:00", ""));
train = new Train("KTX002", "부산역", "09:00", "서울역",
"12:00", 180, "KTX",stopStations, seats);
//seats가 가지고 있는 주소를 그대로 집어넣으면
//KTX001이 변경이 되면 같이 변함 그래서 다시* 생성
trains.add(train);
}
Train Reservation Entity
Cost
//비용 Entity class
public class Cost {
//비용 (class - 출발역, 도착역, 금액)
//(출발역과 도착역의 정보 있어야하고 그에 매칭되는 값 필요)
private String departureStation;
private String arrivalStation;
private int amount;
//기본 생성자
public Cost() {}
//생성자 //cost 클래스에서만 다 직접 작성하고 나머지는 source로 자동 완성함
public Cost(String departureStation, String arrivalStation, int amount) {
this.departureStation = departureStation;
this.arrivalStation = arrivalStation;
this.amount = amount;
}
//Getter //entity의 경우에는 setter을 쓰지 않는다
public String getDepartureStation() {
return this.departureStation;
}
public String getArrivalStation() {
return this.arrivalStation;
}
public int getAmount() {
return this.amount;
}
public String toString() {
//오브젝트 클래스에 toString 메서드 오버라이드한것
return "Cost[departureStation: ]" + this.departureStation +
", arrivalStation : " + this.arrivalStation +
", amount : " + this.amount + "]";
}
Seat
//남아있는 좌석 (class - 호차, 좌석번호, 좌석상태 )
//(예약여부의 상태, 몇호차인지에 대한 상태 )
public class Seat/*단수형태 명사*/ {
private int roomNumber;
private String seatNumber;
private boolean seatStatus;
public Seat() {}
//생성자
public Seat(int roomNumber, String seatNumber, boolean seatStatus) {
super();
this.roomNumber = roomNumber;
this.seatNumber = seatNumber;
this.seatStatus = seatStatus;
}
//getter
public int getRoomNumber() {
return roomNumber;
}
public String getSeatNumber() {
return seatNumber;
}
public boolean isSeatStatus() { //불린형태라 is로 찍힘
return seatStatus;
}
@Override
public String toString() {
return "Seat [roomNumber=" + roomNumber + ", seatNumber="
+ seatNumber + ", seatStatus=" + seatStatus + "]";
}
StopStation
// 정차역 Entity class
public class StopStation {
//정차역 (class - 역 이름, 도착시간, 출발시간 )
private String stationName;
private String departureTime;
private String arriavalTime;
public StopStation() {}
public StopStation(String stationName,
String departureTime, String arriavalTime) {
super();
this.stationName = stationName;
this.departureTime = departureTime;
this.arriavalTime = arriavalTime;
}
public String getStationName() {
return stationName;
//Cost class처럼 다른 지역변수가 없기
//this 안 사용해도 인식하지만 직접 작성할때는 this찍는게 좋다
}
public String getDepartureTime() {
return departureTime;
}
public String getArriavalTime() {
return arriavalTime;
}
@Override
public String toString() {
return "StopStation [stationName=" +
stationName + ", departureTime=" + departureTime +
", arriavalTime="+ arriavalTime + "]";
}
Train
import java.util.List;
//기차 정보 Entity class
public class Train {
private String trainNumber; //열차번호
private String departureStation;
private String departureTime; //출발시간
private String arrivalStation;
private String arrivalTime; //도착시간
private int takeMinute; //걸리는 시간
private String type; //열차 종류
//하나의 클래스에 다른 클래스가 엮여있는것 : 관계가 있다.
private List<StopStation> stopStations; //정차역
private List<Seat> seats; //남아있는 좌석
public Train() {}
public Train(String trainNumber,
String departureStation, String departureTime,
String arrivalStation, String arrivalTime,
int takeMinute, String type, List<StopStation> stopStations,
List<Seat> seats) {
super();
this.trainNumber = trainNumber;
this.departureStation = departureStation;
this.departureTime = departureTime;
this.arrivalStation = arrivalStation;
this.arrivalTime = arrivalTime;
this.takeMinute = takeMinute;
this.type = type;
this.stopStations = stopStations;
this.seats = seats;
}
public String getTrainNumber() {
return trainNumber;
}
public String getDepartureStation() {
return departureStation;
}
public String getDepartureTime() {
return departureTime;
}
public String getArrivalStation() {
return arrivalStation;
}
public String getArrivalTime() {
return arrivalTime;
}
public int getTakeMinute() {
return takeMinute;
}
public String getType() {
return type;
}
public List<StopStation> getStopStations() {
return stopStations;
}
public List<Seat> getSeats() {
return seats;
}
@Override
public String toString() {
return "Train [trainNumber=" + trainNumber + ", departureStation=" +
departureStation + ", departureTime="
+ departureTime + ", arrivalStation=" +
arrivalStation + ", arrivalTime=" + arrivalTime
+ ", takeMinute=" + takeMinute +
", type=" + type + ", stopStations=" +
stopStations + ", seats="
+ seats + "]";
}
TrainReservation DTO
import java.util.Scanner;
//DTO : data Transfer Object
//레이어 간 데이터를 전송할 때 사용하는 객체
public class GetTrainListDto {
private String departureStation;
private String arrivalStation;
private String departureTime;
private int numberOfPeople;
//dto는 getter setter 둘다 사용
//기본생성자, 메인어플리케이션에 입력하는 개념을 여기서 구현할수있다.
public GetTrainListDto() {
Scanner scanner = new Scanner(System.in);
System.out.print("출발역 : ");
this.departureStation = scanner.nextLine();
System.out.println("도착역 : ");
this.arrivalStation = scanner.nextLine();
System.out.println("출발시간 : ");
this.departureTime = scanner.nextLine();
System.out.println("인원 : ");
this.numberOfPeople = scanner.nextInt();
}
public GetTrainListDto(String departureStation,
String arrivalStation, String departureTime,
int numberOfPeople) {
super();
this.departureStation = departureStation;
this.arrivalStation = arrivalStation;
this.departureTime = departureTime;
this.numberOfPeople = numberOfPeople;
}
//get
public String getDepartureStation() {
return departureStation;
}
public String getArrivalStation() {
return arrivalStation;
}
public String getDepartureTime() {
return departureTime;
}
public int getNumberOfPeople() {
return numberOfPeople;
}
//set
public void setDepartureStation(String departureStation) {
this.departureStation = departureStation;
}
public void setArrivalStation(String arrivalStation) {
this.arrivalStation = arrivalStation;
}
public void setDepartureTime(String departureTime) {
this.departureTime = departureTime;
}
public void setNumberOfPeople(int numberOfPeople) {
this.numberOfPeople = numberOfPeople;
}
@Override
public String toString() {
return "GetTrainListDto [departureStation=" + departureStation + ", arrivalStation=" + arrivalStation
+ ", departureTime=" + departureTime + ", numberOfPeople=" + numberOfPeople + "]";
}