[20230714] 클라우드 플랫폼 기반 웹서비스 개발자 양성 과정 7일차.

양희정·2023년 7월 18일
0

주차장 관리 프로그램2

여유 공간 확인
입차
주차 확인
출차

관리 데이터
차량번호, 차종, 주차공간, 층수, 입차시간, 출차시간, 요금

층 수 : 10층 | 층 당 30대,
경차 : 1000 | 중대형 : 1500 | SUV : 2000

class ParkingSpace {
	String registerNumber;
	int getInTime;
	String type;
	
	ParkingSpace(String registerNumber, int getInTime, String type) {
		this.registerNumber = registerNumber;
		this.getInTime = getInTime;
		this.type = type;
	}
}

class EnterCarDto {
	String registerNumber;
    String type;
    int getInTime;
    int layer;
    int space;
    
    EnterCarDto(String registerNumber, String type, int getInTime, int layer, int space) {
    	this.registerNumber = registerNumber;
    	this.type = type;
    	this.getInTime = getInTime;
    	this.layer = layer;
    	this.space = space;
    }
    
    static EnterCarDto getInstance() { // 새로운 인스턴스를 만들어주는 메소드 = 인스턴스가 먼저 존재할 수 없다!
    	
    	EnterCarDto instance = null;
    	
    	try {
	    	Scanner scanner = new Scanner(System.in);
			
			System.out.println("차량 번호 : ");
			String registerNumber = scanner.nextLine();
			
			System.out.println("차종 : ");
			String type = scanner.nextLine();
			
			System.out.println("입차 시간 (0 ~ 24) : ");
			int getInTime = scanner.nextInt();
			
			System.out.println("주차 층 (0 ~ 9) : ");
			int layer  = scanner.nextInt();
			
		    System.out.println("주차 공간 (0 ~ 29) : ");
		    int space = scanner.nextInt();
		    
		    // todo : 차량번호 (빈값인지 아닌지)
		    if(registerNumber.isBlank()) {
		    	System.out.println("차량번호를 반드시 입력하세요.");
		    	return null;
		    }
			// todo : 사용자입력 검증
		    if(registerNumber == null || type == null) {
		    	System.out.println("입력 오류입니다.");
		    	return null;
		    }
		    
		    // todo : 차종(경차, 중대형, SUV로 입력했는지
		    boolean validType = type.equals("경차") || type.equals("중대형") || type.equals("SUV");
		    if(!validType) {
		    	System.out.println("경차, 중대형, SUV 중에 하나를 입력하세요.");
		    	return null;
		    }
		    
			// todo : 입차시간 (0 ~ 24 사이 인지)
		    if(getInTime < 0 || getInTime > 24) {
		    	System.out.println("입차 시간은 0 ~ 24 사이 이어야 합니다.");
		    	return null;
		    }
			
			// todo : 추차 증 ( 0  ~ 9 사이 인지)
		    if(layer < 0 || layer >9) {
		    	System.out.println("주차 층은 0 ~ 9 사이 이어야 합니다.");
		    	return null;
		    }
			
			// todo : 주차 공간  (0 ~ 2 9)
		    if(space < 0 || space > 29) {
		    	System.out.println("주차 공간은 0 ~ 29 사이 이어야 합니다.");
		    	return null;
		    }
		    
		    instance = new EnterCarDto(registerNumber, type, getInTime, layer, space); // 인스턴스 생성.
		    
	    } catch(Exception exception) {
	    	System.out.println("입력 오류입니다.");
	    }
    	return instance;
    }
}

class FindCarDto {
	int floor;
	int space;
	
	FindCarDto(int floor, int space) {
		this.floor = floor;
		this.space = space;
	}
}

public class Parking2Application {
	
	static final int lIGHT_FARE = 1000; // 데이터가 고정되어있기 때문에 상수로 선언함.
	static final int HEAVY_FARE = 1500;
	static final int SUV_FARE = 2000;
	
	static final ParkingSpace[][] PARKING_SPACES = new ParkingSpace[10][30];
	
	public static void main(String[] args) {
		
		while(true) {
			
			// -1: 잘못된 값 / 0~5 정상값
			int selectdeMethod = input();
			if (selectdeMethod == -1) continue;
			
			if(selectdeMethod == 0) {
				System.out.println("프로그램 종료");
				break;
			}
			
			if(selectdeMethod ==  1) getAllFreeSpace();
			if(selectdeMethod ==  2) getFloorFreeSpace();
			if(selectdeMethod ==  3) enterCar();
			if(selectdeMethod ==  4) checkParking();
			if(selectdeMethod ==  5) outCar();
			
			
		}
	}
	
	static int input() {
		
		Scanner scanner = new Scanner(System.in);
		
		System.out.println("작업을 선택하세요. ( 1. 전체 주차공간 확인 | 2 층별 주차공간 확인 | 3. 입차 | 4. 차량확인 | 5. 출차 | 0.종료 ) : ");
		
		int selectdeMethod = -1; // 정상적이지 않는 숫자를 넣음
		try {
			selectdeMethod = scanner.nextInt();
		} catch(Exception exception) {
			System.out.println("잘못된 입력입니다.");
			return -1;
		}
		
		boolean validInput = selectdeMethod  < 0  || selectdeMethod > 5;
		if(validInput) {
			System.out.println("잘못된 입력입니다.");
			return -1;
		}
		
		return selectdeMethod;
	}
	
	static void getAllFreeSpace() {
		// todo : 전체 여유공간 출력
		int sum = 0;
		
		for(ParkingSpace[] floor: PARKING_SPACES) {
			for(ParkingSpace space: floor) {
				if(space == null) sum++;
			}
		}
		System.out.println("전체 여유 공간 : " + sum);
	}
	
	static void getFloorFreeSpace() {
		// todo : 층별 여유 공간 출력
		int[] freeSpaces = new int[10];
		
		for(int layer = 0; layer < PARKING_SPACES.length; layer++) {
			for(ParkingSpace space: PARKING_SPACES[layer]) {
				if(space == null) freeSpaces[layer]++;
			}
		}
		for(int layer =  0; layer < freeSpaces.length; layer++) {
			System.out.println(layer + 1 + "층의 여유 공간: " + freeSpaces[layer]);
		}
	}
	
	static void enterCar() { // 메소드는 80줄 이상이면 돼ㅑ.? 80줄 이하면 깔끔하지그치
		// todo : 입차 처리
		// todo : 사용자로부터 입력 (차량번호, 차종, 입차시간,  주차층, 주차공간)
		
	    EnterCarDto dto = EnterCarDto.getInstance(); // getInstance() : 인스턴스를 만들어 주는 메소드
	    if(dto == null) return;
		
		// todo : 해당 공간이 비어있는지.
	    if(PARKING_SPACES[dto.layer][dto.space] != null) {
	    	System.out.println("이미 주차된 공간입니다.");
	    	return;
	    }
		
		// todo : 입차 처리
	    PARKING_SPACES[dto.layer][dto.space] = new ParkingSpace(dto.registerNumber, dto.getInTime, dto.type);
	}
	
	static void checkParking() {
		// todo : 주차 확인
		Scanner scanner = new Scanner(System.in);
		System.out.println("차량 번호를 입력하세요.");
		String registerNumber = scanner.nextLine();
		
		if(registerNumber == null) {
			System.out.println("입력 오류입니다.");
			return;
		}
		
		if(registerNumber.isBlank()) {
			System.err.println("차량 번호를 반드시 입력해주세요.");
			return;
		}
		
		FindCarDto findCarDto = findCar(registerNumber);
		
		if(findCarDto  == null) {
			System.out.println("찾을 수 없는 차량 번호입니다.");
			return;
		}
		
		System.out.println(findCarDto.floor + "층 " + findCarDto.space + "번에 위치합니다.");
	}
	
	static void outCar() {
		// todo : 출차 처리
		//차량번호, 출차시간 입력 -> 입력검증 (변수null인지, 빈 값인지.) -> 주차공간에서 해당 차량 찾기 -> 존재하는 차량인지 검증. -> 
		// 입력한 출차시간이 입차시간보다 작은지 검증 -> 정산 -> 주차공간에서 차량 제거
		String registerNumber = null;
		int outTime = -1;
		try {
			Scanner scanner = new Scanner(System.in);
			System.out.println("차량번호 : ");
			registerNumber = scanner.nextLine();
			System.out.println("출차시간(0 ~ 24) : ");
			outTime = scanner.nextInt();
		} catch (Exception exception) {
			System.out.println("입력 오류입니다.");
			return;
		}
		
		if(registerNumber == null) {
			System.out.println("입력 오류입니다.");
			return;
		}
		
		if(registerNumber.isBlank()) {
			System.out.println("차량번호를 반드시 입력해주세요.");
			return;
		}
		
		if(outTime < 0 || outTime > 24) {
			System.out.println("출차 시간은 0 ~ 24 사이어야 합니다.");
			return;
		}
		
		FindCarDto findCarDto = findCar(registerNumber);
		if(findCarDto == null) {
			System.out.println("찾을 수 없는 차량입니다.");
			return;
		}
		
		ParkingSpace parkingSpace = PARKING_SPACES[findCarDto.floor][findCarDto.space];
		if(parkingSpace.getInTime < outTime) {
			System.out.println("출차 시간이 입차 시간보다 작을 수 없습니다.");
			return;
		}
		
		int typePayment = parkingSpace.type.equals("경차") ? lIGHT_FARE :
			parkingSpace.type.equals("중대형") ? HEAVY_FARE : SUV_FARE;
		int payment = (outTime - parkingSpace.getInTime) * typePayment;
		System.out.println("최종 금액은 " + payment + "원 입니다.");
		
		PARKING_SPACES[findCarDto.floor][findCarDto.space] = null;
	}
	
	static FindCarDto findCar(String registerNumber) {
		
		FindCarDto dto = null;
		
		for(int floor = 0; floor < PARKING_SPACES.length; floor++) {
			for(int space = 0; space < PARKING_SPACES[floor].length; space++) {
				if(PARKING_SPACES[floor][space] == null) continue; // continue 다시 조건문으로 돌아감.
					
				if(registerNumber.equals(PARKING_SPACES[floor][space].registerNumber)) {
					dto = new FindCarDto(floor, space);
					break;
				}
			}
			if(dto != null) break;
		}
		
		return dto;
		
	}
	
}

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

소중한 정보 감사드립니다!

답글 달기