반응형
👇 공부한 자료들의 실제 소스파일들을 기록해논 공간입니다 👇
오늘의 실습 과제
문제풀이
package starter;
import movietiket.LoginMain;
public class TicketStarter {
public static void main(String[] args) {
// TODO : 티켓 예약 프로그램 시작
new LoginMain();
}
}
package members;
public class Members {
String memberName = null;
// 회원 비밀번호
String memberPass = null;
// 예약 여부
boolean memberCheck = false;
// 예약 좌석 번호 저장 배열
int[] memberSeet = new int[5];
// 정보 출력 메서드
public void memberInfoPrt() {
System.out.println("[ 성함 ] : " + memberName);
if (memberCheck) {
for (int i = 0; i < memberSeet.length; i++) {
if (0 != memberSeet[i]) {
System.out.println("[ 예약 좌석 ] : " + memberSeet[i]);
}
}
} else System.out.println("[ 예약 좌석 ] : 없음 ");
}
}
package movietiket;
import java.util.Scanner;
public class LoginMain {
Scanner in = new Scanner(System.in);
TicketAdmin ticketAdmin = new TicketAdmin();
Members nowUser = null;
public LoginMain() {
// TODO : 로그인 및 회원가입 생성자
boolean flag = true;
while (flag) {
info();
int inputNumber = in.nextInt();
in.nextLine();
switch (inputNumber) {
case 1:
loginMember();
break;
case 2:
joinMember();
break;
case 3:
flag = false;
System.out.println("프로그램을 종료합니다");
break;
default:
System.out.println("✘ 입력된 메뉴는 없습니다 ✘");
}
}
}
private void info() {
}
// 회원 가입 메서드
private void joinMember() {
nowUser = ticketAdmin.memberAdd();
if (nowUser != null) {
ticketAdmin.infodesk(nowUser);
nowUser = null;
}
}
//로그인 메서드
private void loginMember() {
int cnt = 0;
while (cnt < 3) {
System.out.print("\t ✐ 이름 입력 ➜ ");
String loginName = in.nextLine();
nowUser = ticketAdmin.findName(loginName);
if (nowUser == null) {
System.out.println("입력하신 이름은 가입되지 않았습니다");
break;
} else {
System.out.print("\t ✐ 비밀번호 입력 ➜ ");
String loginPass = in.nextLine();
if (nowUser.memberPass.equals(loginPass)) {
ticketAdmin.infodesk(nowUser);
nowUser = null;
break;
} else {
System.out.println("입력하신 비밀번호는 틀렸습니다");
if (nowUser == null) {
cnt++;
System.out.println("남은 입력 횟수 (" + cnt + "/3)");
}
}
}
}
}
}
package movietiket;
import java.util.Scanner;
public class TicketAdmin {
Scanner in = new Scanner(System.in);
static Members[] members = new Members[10];
String[] defaultSeet = new String[30];
Members tmpUser = null;
Functions fnc = new Functions();
public void infodesk(Members loginUser) {
tmpUser = loginUser;
System.out.println(" [ " + tmpUser.memberName + " ] 고객님 반갑습니다. 정상 로그인 되었습니다.");
boolean flag = true;
while (flag) {
info();
int choice = in.nextInt();
in.nextLine();
switch (choice) {
case 1: // 티켓 예매
ticketBuy();
// 예매 정보를 회원 정보에 등록
break;
case 2: // 예매 확인
ticketConfirm();
break;
case 3: // 전체 좌석 보기
defaultSeetPrt();
break;
case 4: // 좌석 수정
seetEdit();
break;
case 5: // 티켓 취소
seetCancel();
break;
case 6:
System.out.println("로그아웃 ➜ ➜ ➜ 감사합니다");
tmpUser = null;
flag = false;
break;
default:
System.out.println("잘못된 번호 입니다. 다시 입력하세요");
}
}
}
// 티켓 취소
private void seetCancel() {
System.out.println(" 티켓 취소 메뉴 입니다 ");
System.out.println(" [ " + tmpUser.memberName + " ] 님의 예약 정보입니다 ");
tmpUser.memberInfoPrt();
System.out.print("취소할 인원수를 입력하세요 : ");
int cancelCnt = in.nextInt();
in.nextLine();
System.out.println("취소할 좌석 번호를 입력하세요");
for (int i = 0; i < cancelCnt; i++) {
System.out.print("\t ✐ 입력 (" + (i + 1) + "/" + cancelCnt + ") ➜ ");
String seetInput = in.nextLine();
int tmpInputNumber = fnc.normalizeInt(seetInput);
for (int j = 0; j < 1; j++) {
if (defaultSeet[tmpInputNumber] != null) {
defaultSeet[tmpInputNumber] = null;
} else System.out.println("비워져 있는 좌석입니다.");
}
fnc.memberSeetAllClear(tmpUser, tmpInputNumber);
}
tmpUser.memberCheck = fnc.ticketCheck(tmpUser);
System.out.println(tmpUser.memberName + "고객님의 요청하신 " + cancelCnt + "건 취소 완료 되었습니다.");
}
// 예매 수정
private void seetEdit() {
int editcnt = 0 ;
int beforSeetNum = 0, afterSeetNum = 0;
System.out.println("좌석 수정 메뉴 입니다");
// 현재 예약자 정보 출력
tmpUser.memberInfoPrt();
System.out.print("\t ✐ " + tmpUser.memberName + "님 비밀번호 ➜ ");
String pass = in.nextLine();
if (tmpUser.memberPass.equals(pass)) {
// 전체 시트 자리 null로 변경 및 유저 정보에 있는 예약 시트 넘버 초기화
System.out.println("수정할 좌석 개수를 입력하세요");
System.out.print("\t ✐ 숫자만 입력 ➜ ");
editcnt = in.nextInt();
in.nextLine();
for (int i = 0; i < editcnt; i++) {
System.out.println("기존 좌석 번호를 입력하세요");
System.out.print("\t ✐ 입력 (" + (i + 1) + "/" + editcnt + ") ➜ ");
String beforSeet = in.nextLine();
System.out.println("이동 할 좌석 번호를 입력하세요");
System.out.print("\t ✐ 입력 (" + (i + 1) + "/" + editcnt + ") ➜ ");
String afterSeet = in.nextLine();
beforSeetNum = fnc.normalizeInt(beforSeet);
afterSeetNum = fnc.normalizeInt(afterSeet);
if ( defaultSeet[afterSeetNum] != null ) {
System.out.println("예약할 수 없는 자리입니다 처음으로 돌아갑니다");
break;
}
fnc.changeSeet(tmpUser, beforSeetNum, afterSeetNum);
if (defaultSeet[tmpInputNumber] == null) {
// 고객 정보 예약 시트번호 변수 배열에 예약번호 넣어주기
tmpUser.memberSeet[i] = tmpInputNumber;
}
}
// fnc.clearMemberSeet(tmpUser, defaultSeet);
// 기존 시트배열 번호에 정보 업데이트
for (int i = 0; i < tmpUser.memberSeet.length; i++) {
if (tmpUser.memberSeet[i] != 0) {
defaultSeet[tmpUser.memberSeet[i]] = fnc.maskingName(tmpUser.memberName);
} else if (tmpUser.memberSeet[i] == 0) break;
}
if (tmpUser.memberCheck) {
System.out.println("예약 완료");
System.out.print(tmpUser.memberName + " 고객님의 예약 : ");
// 예약된 자리 출력
for (int i = 0; i < editcnt; i++) {
if (tmpUser.memberSeet[i] != 0) System.out.print(tmpUser.memberSeet[i] + "번 ");
}
System.out.println();
}
} else System.out.println("입력된 정보로는 찾을 수 없습니다.");
}
// 티켓 예매 확인
private void ticketConfirm() {
System.out.println("[ " + tmpUser.memberName + " ] 고객님의 예약된 정보입니다 ");
if (tmpUser.memberCheck) {
for (int i = 0; i < tmpUser.memberSeet.length; i++) {
if (tmpUser.memberSeet[i] != 0)
System.out.println((i + 1) + "번째 예약 : 좌석 번호 [ " + tmpUser.memberSeet[i] + "번 ] ");
}
} else System.out.println("[ " + tmpUser.memberName + "] 고객님의 예약된 정보가 없습니다.");
}
// 티켓 예매
private void ticketBuy() {
System.out.println("티켓 예매입니다.");
if (tmpUser.memberCheck) {
System.out.println(tmpUser.memberName + "님의 예약된 정보가 있습니다.추가 불가합니다");
} else {
System.out.println("현재 좌석 내용 입니다.");
defaultSeetPrt();
System.out.println("예약 인원을 선택하세요");
System.out.print("\t ✐ 입력 ➜ ");
int person = in.nextInt();
if (person < 5) {
in.nextLine();
System.out.println("예약할 좌석 번호를 입력하세요");
for (int i = 0; i < person; i++) {
System.out.print("\t ✐ 입력 (" + (i + 1) + "/" + person + ") ➜ ");
String seetInput = in.nextLine();
int tmpInputNumber = fnc.normalizeInt(seetInput);
if (defaultSeet[tmpInputNumber] == null) {
// 고객 정보 예약 시트 변수 배열에 예약번호 넣어주기
tmpUser.memberSeet[i] = tmpInputNumber;
// 고객 정보 예약확인 부분에 체크 true로 바꿔주기
tmpUser.memberCheck = true;
}
}
// 기존 시트에 정보 업데이트
for (int i = 0; i < tmpUser.memberSeet.length; i++) {
if (tmpUser.memberSeet[i] != 0) {
defaultSeet[tmpUser.memberSeet[i]] = fnc.maskingName(tmpUser.memberName);
} else if (tmpUser.memberSeet[i] == 0) break;
}
if (tmpUser.memberCheck) {
// 예약된 자리 출력
tmpUser.memberInfoPrt();
} else System.out.println("이미 예약된 자리입니다. 예약 진행이 종료됩니다");
}
}
}
// 현재 좌석 상태 출력
public void defaultSeetPrt() {
System.out.println("현재 잔여 좌석입니다");
System.out.println("▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ [ S C R E E N ] ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒");
for (int i = 0; i < defaultSeet.length+1; i++) {
if (i == 5 || i == 10 || i == 15 || i == 20 || i == 20) System.out.println();
String tmp = String.format("%10s", i + 1);
if (i + 1 < defaultSeet.length+1 && defaultSeet[i + 1] != null) {
String strTmp = tmp + "번 " + defaultSeet[i + 1];
System.out.print(String.format("%10s", strTmp));
} else if (defaultSeet[i] == null) System.out.print(tmp + "번 가능");
}
System.out.println();
}
// 회원 가입
public Members memberAdd() {
int cnt = 0;
while (cnt < 3) {
System.out.println("회원가입");
System.out.print("\t ✐ 이름 입력 ➜ ");
String name = in.nextLine();
System.out.print("\t ✐ 비밀번호 입력 ➜ ");
String pass = in.nextLine();
// 비밀번호 유효성 체크
if (!fnc.passValidity(pass)) {
System.out.println("입력한 패스워드는 사용할 수 없습니다 다시 시작합니다");
break;
}
// 중복 체크
Members serUser = new Members();
if (findName(name) == null) {
serUser.memberName = name;
serUser.memberPass = pass;
for (int i = 0; i < members.length; i++) {
if (members[i] == null) {
members[i] = serUser;
System.out.println("회원 가입이 완료 되었습니다");
break;
}
}
return serUser;
} else {
System.out.println("일치된 성함이 있습니다. 다시 입력하세요");
cnt++;
System.out.println("남은 입력 횟수 (" + cnt + "/3)");
}
}
return null;
}
// 일치된 이름찾기
public Members findName(String name) {
for (int i = 0; i < members.length; i++) {
if (members[i] != null) {
if (members[i].memberName.equals(name)) {
return members[i];
}
}
}
return null;
}
private void info() {
System.out.println("회원 전용 메뉴 입니다");
System.out.println("1. 티켓 예매");
System.out.println("2. 예매 확인");
System.out.println("3. 전체 좌석 보기");
System.out.println("4. 좌석 수정");
System.out.println("5. 티켓 취소");
System.out.println("6. 로그아웃 ➜ 초기화면 이동");
System.out.print("\t ✐ 입력 ➜ ");
}
}
package movietiket;
public class Functions {
// String 변수에 있는 내용 중 숫자만 추출하는 메서드
public int normalizeInt(String inStr) {
int number = Integer.parseInt(inStr.replaceAll("[^0-9]*$", ""));
return number;
}
// 이름 마스킹 처리 메서드
public String maskingName(String name) {
StringBuilder nameRegex = new StringBuilder(name.substring(0, 1));
for (int j = 0; j < name.length() - 1; j++) {
nameRegex.append("*");
}
return nameRegex.toString();
}
// 좌석 수정 시 예전 좌석 번호와 변경할 좌석 번호와 유저주소값을 입력받아
// 자리이동시켜주는 메서드
public void changeSeet(Members user, int befor, int after){
for (int i = 0; i < user.memberSeet.length; i++) {
if (user.memberSeet[i]==befor) {
user.memberSeet[i]=after;
break;
}
}
}
// 좌석 예매 수정시 기본좌석 및 고객 구매 좌석 배열 초기화
public void clearMemberSeet(Members user, String[] defaultSeet) {
for (int i = 0; i < user.memberSeet.length; i++) {
if (user.memberSeet[i] != 0) {
defaultSeet[user.memberSeet[i]] = null;
} else if (user.memberSeet[i] == 0) break;
}
user.memberSeet = new int[5];
}
// 입력한 수 만큼 고객이 예약한 좌석 초기화 하는 메서드
public void memberSeetAllClear(Members user, int seetNum) {
for (int j = 0; j < user.memberSeet.length; j++) {
if (user.memberSeet[j] == seetNum) {
user.memberSeet[j] = 0;
break;
}
}
}
// 고객이 갖고있는 잔여좌석 여부에 따라서 체크값 리턴해주는 메서드
public boolean ticketCheck(Members user) {
for (int i = 0; i < user.memberSeet.length; i++) {
if (user.memberSeet[i] != 0) {
return true;
}
}
return false;
}
// 비밀번호 규칙유효성 체크
public boolean passValidity(String pass) {
// 제약사항
// 비밀번호는 영문과 숫자만 특수문자를 혀옹한다
// 비밀번호 길이는 최소 5이상 , 숫자는 필수 1개이상, 3개이하 , 특수문자 필수 1개이상 3개이하
boolean answer = false;
int spePass = pass.replaceAll("\\w", "").length(); // 특수문자
int numPass = pass.replaceAll("\\D", "").length(); // 숫자
int engPass = pass.replaceAll("[^A-Za-z]", "").length(); // 영어
answer = spePass > 1 && spePass < 4;
answer = numPass > 1 && numPass < 4;
answer = (spePass + numPass + engPass) > 4;
return answer;
}
}
느낀점
아직 코드들이 너무 난잡하다는 걸 느꼈다.
시간 복잡도도 그렇고 반복되는 소스가 많다.
간결하지 않은 코드들이 계속 작성되는데 노력해야 할 것 같다
반응형
'👩🏻💻 𝐋𝐚𝐧𝐠𝐮𝐚𝐠𝐞 > ⠀⠀⠀⠀ Jᴀᴠᴀ' 카테고리의 다른 글
2023/10/30 📝 Getter & Setter (0) | 2023.11.01 |
---|---|
2023/10/27 🎈접근제어자 (0) | 2023.11.01 |
2023/10/24 😍 클래스 실습 과제 (1) | 2023.10.31 |
2023/10/23✨ 클래스 (0) | 2023.10.31 |
2023/10/20 ⭐️ 조별미션 - 즐겨봐요 게임의숲 (1) | 2023.10.20 |