1. UserSystem - SignUp
수정사항
- 각각 반복이 되어야 하기 때문에 기존에 하나로 합쳐져있던 signUp 메소드를 각각 나누었습니다.
void signUp() { // 휴대폰 번호 입력 반복문
System.out.println("휴대폰 번호(ID) 입력 | 0. 초기화면");
Matcher phone;
this.userPhoneNum = input.nextLine().trim(); // 휴대폰번호를 받아서 공백 제거
phone = userPhonNumPattern.matcher(this.userPhoneNum); // 패턴에 맞는지 확인
if (this.userPhoneNum.equals("0")){
System.out.println("초기화면으로 돌아갑니다");
} else if (!phone.find()) { // 형식에 맞지 않으면
System.out.println("아래 형식에 맞게 입력해 주세요"); // 재입력 문구 출력
System.out.println("ex) 010-1234-5678");
signUp();
} else if (userList.containsKey(userPhoneNum)) { // userList의 key에 이미 같은 번호가 있으면
System.out.println("이미 등록된 아이디입니다"); // 등록된 아이디라고 출력
signUp();
} else { // 둘 다 아니면
signUpPwd();
}
}
void signUpPwd () {// 비밀번호 입력 반복문
System.out.println("비밀번호를 입력해주세요 | 0. 초기화면");
System.out.println("------------------------");
System.out.println("비밀번호 형식 : \n1. 최소 영문 하나 이상 포함\n2. 특수 문자(!@#$%^&*?_~),숫자,영문(대소문자)만 가능\n3. 6글자 ~ 8글자");
System.out.println("------------------------");
Matcher pwd;
this.userPwd = input.nextLine();
pwd = userPwdPattern.matcher(this.userPwd); // 비밀번호 입력 받아서 확인
if(this.userPwd.equals("0")){
System.out.println("초기화면으로 돌아갑니다");
}
else if (!pwd.find()) { // 패턴에 맞지 않으면
System.out.println("비밀번호 형식을 확인하고 재입력 해주세요"); // 재입력
signUpPwd();
} else { // 아니면
signUpName();
}
}
void signUpName() {// 이름 입력 반복문
System.out.println("이름을 입력해주세요 | 0. 초기화면");
Matcher name;
userName = input.nextLine();
name = userNamePattern.matcher(this.userName); // 이름 입력 받은 후 형식 확인
if(userName.equals("0")){
System.out.println("초기화면으로 돌아갑니다");
}
else if (!name.find()) { // 아니면
System.out.println("다시 한 번 이름을 입력해 주세요");// 오류 출력
System.out.println("ex) 홍길동 ");
signUpName();
} else {
userList.put(userPhoneNum, new User(userPhoneNum, userName, userPwd));
io.writeUserList();
showResult();
}
}
출력 예시

2. UserSystem - userLogin
수정사항
- 기존 메소드에 if문만 하나 더 추가했습니다.
public int userLogin() {
int cnt = 0;
while (cnt == 0) {
System.out.println("ID를 입력해주세요 | 0. 초기화면");
System.out.println("ID는 휴대폰 번호입니다. (010-0000-0000)");
userPhoneNum = input.nextLine().trim();
Matcher phone = userPhonNumPattern.matcher(userPhoneNum);
if (userPhoneNum.equals("0")){
System.out.println("초기화면으로 돌아갑니다");
break;
}
else if (!phone.find()) {
System.out.println("휴대폰 번호 양식에 맞춰서 다시 입력해주세요");
System.out.println("ex) 010-1234-5678");
continue;
} else if (!userList.containsKey(userPhoneNum)) {
System.out.println("ID를 찾을 수 없습니다");
System.out.println("다시 한 번 정확히 입력해 주세요");
continue;
}
for (cnt = 3; cnt > 0; cnt--) {
System.out.println("비밀번호를 입력해주세요");
userPwd = input.nextLine();
if (userList.get(userPhoneNum).getUserPwd().equals(userPwd)) {
System.out.println();
System.out.println("***************");
System.out.println(userList.get(userPhoneNum).getUserName() + "님, 환영합니다!");
System.out.println("***************");
System.out.println();
Menu.cur_user_id = userPhoneNum;
break;
} else {
if (cnt > 1) {
System.out.println("입력하신 비밀번호가 잘못되었습니다");
System.out.print((cnt - 1) + "번의 기회가 남았습니다. 올바른 ");
} else {
System.out.println("입력하신 비밀번호가 잘못되었습니다");
System.out.println("처음으로 돌아갑니다");
return cnt;
}
}
}
}
return cnt + 1;
}
출력 예시

3. AdminSystem - addBike()
수정사항
- 기존 코드에 이전화면으로 돌아가기(0) 추가
- 등록 대수 입력 시 숫자를 제외한 아무키를 누를 경우 (try/catch) 취소 처리 (이전화면)
HashMap<String, Bike> addBike() {
System.out.println("등록하고자 하는 자전거의 종류를 입력하세요");
System.out.println("1. 1인용 자전거 | 2. 2인용 자전거 | 0. 돌아가기");
while (true) {
int input = 0;
try {
input = Integer.parseInt(scan.nextLine());
} catch (NumberFormatException e) {
System.out.println("1인용은 1번, 2인용은 2번, 이전 메뉴로 돌아가시려면 0번을 입력해 주세요");
continue;
}
if (!(input == 1 || input == 2 | input == 0)) {
System.out.println("1인용 혹은 2인용만 등록 가능합니다");
System.out.println("1인용은 1번, 2인용은 2번, 이전 메뉴로 돌아가시려면 0번을 입력해 주세요");
} else if (input == 0) {
System.out.println("이전메뉴으로 돌아갑니다"); // 추가
return null;
} else {
System.out.println("등록할 자전거 대수를 입력하세요 | 취소: 숫자 제외 아무키");
int amount = 0;
try {
amount = Integer.parseInt(scan.nextLine());
} catch (NumberFormatException e) {
System.out.println("자전거 등록이 취소되었습니다");
System.out.println("이전 메뉴로 돌아갑니다");
return null;
}
String bikeId;
if (input == 1) {
for (int i = 0; i < amount; i++) {
bikeId = String.format("S-%04d", bikeList.size());
bikeList.put(bikeId, new Bike(BikeType.Single, 1000));
io.writeBikeList();
System.out.println("[" + bikeId + "가 등록되었습니다]");
}
return bikeList;
} else {
for (int i = 0; i < amount; i++) {
bikeId = String.format("T-%04d", bikeList.size());
bikeList.put(bikeId, new Bike(BikeType.Twin, 2000));
io.writeBikeList();
System.out.println("[" + bikeId + "가 등록되었습니다]");
}
return bikeList;
}
}
}
}
출력 예시

4. AdminSystem - removeBike()
수정사항
- 기존 코드에 돌아가기(0번) 기능 추가
- 삭제 일련번호 입력 시 취소 기능 추가
- 특정 자전거 삭제 메서드 분리
void removeBike() {
io.loadRentList();
int menu = 0;
try {
scan = new Scanner(System.in);
System.out.println("원하는 삭제 방법을 선택해 주세요");
System.out.println("1. 특정 자전거 삭제 | 2. 일괄 삭제 | 0. 돌아가기");
menu = Integer.parseInt(scan.nextLine());
} catch (NumberFormatException e) {
System.out.println("숫자만 입력 가능합니다");
}
if (!(menu == 1 || menu == 2 | menu == 0)) {
System.out.println("잘못 입력하셨습니다");
} else if (menu == 0) {
System.out.println("이전메뉴로 돌아갑니다"); // 추가
}
else if (bikeList.isEmpty()) {
System.out.println("등록된 자전거가 없습니다."); // 수정
} else if (menu == 2) {
for (Map.Entry<String, Bike> entrySet : bikeList.entrySet()) {
if (entrySet.getValue().getRentalStatus().equals(RentalStatus.UNAVAILABLE)) {
System.out.println("대여중인 자전거가 있습니다");
System.out.println("자전거를 모두 반납 후 시도해 주세요");
break;
} else {
bikeList.clear();
System.out.println("리스트가 초기화 되었습니다");
io.writeBikeList();
break;
}
}
} else removeById();
}
void removeById() {
while (true) {
String id = null;
try {
System.out.println("삭제 하고자 하는 자전거의 일련번호를 입력해 주세요");
id = scan.nextLine();
} catch (Exception e) {
System.out.println(e.getMessage());
}
if (id.equals("0")){
System.out.println("삭제가 취소되었습니다.");
break;
}
else if (!bikeList.containsKey(id)) {
System.out.println("일치하는 자전거가 없습니다 | 0. 취소");
} else if (bikeList.get(id).getRentalStatus().equals(RentalStatus.UNAVAILABLE)) {
System.out.println("해당 자전거는 대여중 입니다 | 0. 취소");
} else {
bikeList.remove(id);
System.out.println(id + " 자전거가 삭제되었습니다");
io.writeBikeList();
break;
}
}
}
###출력 예시

5. AdminSystem - adminLogin() / Menu - displayDefaultMenu()
- 기존 코드에 ID 입력 및 비밀번호 입력 화면에서 초기화면 돌아가기 추가
- 디폴트 메뉴 메서드에 3번 변수 a > '성공여부'로 변수명 변경
- adminLogin 성공시만 true 값 반환받아 adminMenu 출력되도록 수정
boolean adminLogin() {
String id;
String pwd;
while (true) {
System.out.println("관리자 ID | 0. 초기화면");
id = scan.nextLine().trim().toLowerCase();
if (id.equals("0")) {
System.out.println("초기화면으로 돌아갑니다"); // 돌아가기 추가
return false;
} else if (!adminMap.containsKey(id)) {
System.out.println("ID가 맞지 않습니다. 재입력 해주세요");
} else break;
}
System.out.println("관리자 비밀번호를 입력해주세요 | 0. 초기화면");
pwd = scan.nextLine().trim();
if (pwd.equals("0")) {
System.out.println("초기화면으로 돌아갑니다");
} else if (adminMap.get(id).equals(pwd)) {
System.out.println("관리자 인증이 완료되었습니다!");
return true;
} else {
System.out.println("비밀번호가 맞지 않습니다. 재입력 해주세요");
adminLogin();
} return false;
}
public void displayDefaultMenu() { // 첫 메뉴 번호입력
// 회원가입, 사용자 인증, 관리자 인증, 프로그램 종료
while (true) {
System.out.println();
System.out.println("******비트를 타쇼 자전거 대여 시스템******");
System.out.println(" 원하는 메뉴의 번호를 입력하세요");
System.out.println(" 1. 회원 가입");
System.out.println(" 2. 사용자 인증");
System.out.println(" 3. 관리자 인증");
System.out.println(" 4. 프로그램 종료");
System.out.println("**********************************");
int menu;
do {
try {
menu = Integer.parseInt(input.nextLine());
if (menu >= 1 && menu <= 4) {
break;
} else {
throw new Exception("메뉴 번호 오류");
}
} catch (Exception e) {
System.out.println("오류발생: " + e.getMessage());
System.out.println("1~4 중 다시 입력해주세요");
}
} while (true);
switch (menu) {
case 1:
userSystem.signUp();
break;
case 2: // 변수명 수정
int isSuccess = userSystem.userLogin();
if (!(isSuccess == 1)) {
displayUserMenu();
}
break;
case 3: // 로직 수정
if((adminSystem.adminLogin())) {
displayAdminMenu();
}
break;
case 4:
System.out.println("이용해주셔서 감사합니다!");
return;
}
}
}
출력 예시


1. UserSystem - SignUp
수정사항
출력 예시
2. UserSystem - userLogin
수정사항
출력 예시
3. AdminSystem - addBike()
수정사항
출력 예시
4. AdminSystem - removeBike()
수정사항
###출력 예시

5. AdminSystem - adminLogin() / Menu - displayDefaultMenu()
출력 예시