반응형

 

👇 공부한 자료들의 실제 소스파일들을 기록해논 공간입니다 👇

 

 

오늘의 실습 과제

 

 

 


 

 

 

문제풀이

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;
    }


}

 


 

느낀점

아직 코드들이 너무 난잡하다는 걸 느꼈다.

시간 복잡도도 그렇고 반복되는 소스가 많다.

간결하지 않은 코드들이 계속 작성되는데 노력해야 할 것 같다

 

반응형
유리쯔의일상