공부/Java 복습

Java 차량 5부제

ChoiDooSic 2021. 8. 16. 22:53

차량 5부제 만들기
조건 2018년 9월 1일 부터 끝번호차량 출입제한
월 1,6 화 2,7 수 3,8 목 4,9 금 5,0 공휴일 제외 및 장애인,유아동승,경차 등 제외

차량 5부제를 검사해주는 프로그램을 만들기에 앞서 랜덤으로 차량을 만들 클래스를 간단하게 설명한다

[VehicleDeductibleCar()] 에서 사용할 랜덤한 차량을 만들어주는 클래스이다

cars배열에 차량의 종류를 담아주고 except_car배열에 제외차량을 담아준다

number변수에 랜덤하게 각 차량의 번호를 넣어주는데 random클래스에 nextint함수를 이용하여

0~9999번까지 랜덤하게 번호를 부여해줄것이다.

이때에 랜덤하게 0~9999번이라면 0번차량 100번차량 등 1,2,3자리 수의 번호의 차량이 나올수도 있기 때문에

%04d(% -  명령의시작, 0 - 채워질 문자, 4 - 총 자리수, d - 십진정수)를 이용하여 0100, 0001 등...

4자리수가 나올 수 있게 해준다.

그리고 car에는 cars배열의 길이만큼 랜덤으로 돌려 차가 나올 수 있게 해주며

String.format을 이용해 문자열의 형식을 설정하여 인스턴스를 찍어낼때에 경차0017 , 중형차 9956... 식으로 

나올수 있게 해준다.

[VehicleDeductible] 클래스는 차량 5부제 검사를 시행하는 클래스이다.

익명 클래스를 선언하여 ArrayList<LocalDate>holydays에 양력의 공휴일을 담아준다.

[pass_car()] 메서드는 차량을 만든 클래스인 VehicleDeductibleCar클래스에서 제외차량의 배열을 가져와

제외차량 배열의 사이즈만큼 반복문을 돌려 contains로 제외차량의 단어가 포함되어 있는지 판별해

들어있다면 true를 반환 없다면 false를 반환해주는 메서드이다.

[pass_week()] 메서드는 공휴일인지 판별하여 주는 메서드이다

for each문을 이용하여 holydays에 들어있는 휴일들을 하나씩 검사하여 오늘이 공휴일이라면 true를

아니라면 false를 반환하여 준다.

getDayOfMonth는 월의 몇번째 일인지 반환하여주고

getMonthValue는 월을 반환하여준다.

[notPassCarLastNum()] 메서드는 매개변수로 인스턴스로 찍어낸 차와 현재 시간을 받아서

차량의 끝번호가 출입 제한 요일에 해당하는지 검사해주는 메서드이다.

day_of_value에 현재 요일의 값을 담아준다 (getDayOfWeek.getValue()는 월요일부터 일요일까지를

1~7의 int값으로 반환해준다)

first_num에는 앞자리의 시행일을 담고 last_num에는 시행일의 뒷자리를 담는다

예) 월 1(앞자리),6(뒷자리)

공휴일을 제외하고 계산하기 때문에 반복문은 총5회 돌며 day_of_value요일의 값이 월~금 일때에

toString().endsWith를 이용하여 차량의 끝번호만을 검사하여

true를 반환한다면 5부제 해당 차량번호이며 false를 반환한다면 5부제 미해당 차량번호임을 판별해준다.

메인에서는 만들어둔 메서드들을 이용하여 5부제 해당차량인지 검사하여준다

첫번째로 검사하는 befor_except_time변수에 5부제 시행전일을 담아줘 isAfter메서드를 이용하여

현재시간 now_time이 2018년8월31일 이후 인지를 판별하여주고 pass_car와 pass_week메서드를 이용하여

공휴일인지 제외차량인지를 먼저 판별하여 하나라도 해당된다면 출입 가능함을 알려주고

전부 해당되지않는다면

notPassCarLastNum 메서드를 이용하여 5부제 해당차량인지 검사하여주며 이곳도 문제없다면

else에서 출입 가능임을 알려준다.

2021-08-16은 월요일 이며 차량 끝번호 1,6번이 해당된다.