국비학원 13일차 : 기차예약 프로세스

Digeut·2023년 3월 13일
0

국비학원

목록 보기
13/44

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 + "]";
	}
	

profile
개발자가 될 거야!

0개의 댓글