기본 기능은 모두 완성하였고 프로그램이 정상 작동하나, 예외 처리 부분이 미흡함
package kh.edu.updown.model.vo;
public class Member {
private String memberId; // 아이디
private String memberPw; // 비밀번호
private String memberName; // 이름
private int highScore; // 최고 점수
// 생성자
public Member() { }
public Member(String memberId, String memberPw, String memberName) {
super();
this.memberId = memberId;
this.memberPw = memberPw;
this.memberName = memberName;
}
public Member(String memberId, String memberPw, String memberName, int highScore) {
super();
this.memberId = memberId;
this.memberPw = memberPw;
this.memberName = memberName;
this.highScore = highScore;
}
// getter / setter
public String getMemberId() {
return memberId;
}
public void setMemberId(String memberId) {
this.memberId = memberId;
}
public String getMemberPw() {
return memberPw;
}
public void setMemberPw(String memberPw) {
this.memberPw = memberPw;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
public int getHighScore() {
return highScore;
}
public void setHighScore(int highScore) {
this.highScore = highScore;
}
@Override
public String toString() {
return "Member [memberId=" + memberId + ", memberPw=" + memberPw + ", memberName=" + memberName + ", highScore=" + highScore
+ "]";
}
}
package kh.edu.updown.model.service;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
import kh.edu.updown.model.vo.Member;
public class MainService {
private Scanner sc = new Scanner(System.in);
// 회원 가입된 회원의 정보를 저장할 배열 선언 및 할당
private Member[] members = new Member[3];
private int memberCount = 0; // 현재 가입한 회원 수 (회원 가입 시 members 인덱스 지정에 사용 가능)
// 현재 로그인한 회원의 정보를 참조할 변수 선언.
private Member loginMember = null; // 로그인 X == null, 로그인 O != null
// LoginService 생성
// -> 로그인 시 이용할 수 있는 기능만을 모아둔 객체
private LoginService loginService = new LoginService();
// 메뉴 출력 메소드
// * 메뉴 출력 메소드를 분석해보세요!
public void displayMenu() {
int sel = 0; // 메뉴 선택용 변수
do { // 무조건 한 번은 수행
try {
System.out.println();
System.out.println("=== UP/DOWN 게임 ===");
if(loginMember == null) { // 로그인이 되어있지 않은 경우
System.out.println("[메인 메뉴]");
System.out.println("1. 회원가입");
System.out.println("2. 로그인");
System.out.println("0. 종료");
System.out.print("메뉴 선택 >> ");
sel = sc.nextInt();
sc.nextLine(); // 입력 버퍼 개행문자 제거
System.out.println(); // 줄바꿈
switch(sel) {
case 1 : signUp(); break;
case 2 : login(); break;
case 0 : System.out.println("[프로그램 종료]"); break;
default : System.out.println("잘못 입력하셨습니다. 메뉴를 다시 선택해주세요.");
}
}else { // 로그인이 되어있는 경우
System.out.println("[로그인 메뉴]");
System.out.println("1. 업/다운 게임 start");
System.out.println("2. 내 정보 조회");
System.out.println("3. 전체 회원 조회");
System.out.println("4. 비밀번호 변경");
System.out.println("9. 로그아웃");
System.out.println("메뉴 선택 >> ");
sel = sc.nextInt();
sc.nextLine();
System.out.println();
// 선택된 메뉴 번호에 따라 LoginService에서 알맞은 기능을 호출
switch (sel) {
case 1: loginService.startGame(loginMember); break;
case 2: loginService.selectMyInfo(loginMember); break;
case 3: loginService.selectAllMember(members); break;
case 4: loginService.updatePassword(loginMember); break;
case 9 : System.out.println("[로그아웃 되었습니다.]");
loginMember = null; // loginMember 필드에 아무것도 참조하고 있지 않음을 의미하는 null을 대입
break;
default: System.out.println("잘못 입력하셨습니다. 메뉴를 다시 선택해주세요.");
}
}
}catch (InputMismatchException e) {
System.out.println("정수만 입력해주세요.");
sc.nextLine(); // 버퍼에 남아있는 문자열 제거
}
}while(sel != 0);
}
// [회원 가입]
/**
* 회원 가입
*/
public void signUp() {
System.out.println("[회원 가입]");
// 아이디, 비밀번호, 이름을 입력 받고
System.out.print("아이디 입력 : ");
String inputId = sc.nextLine();
System.out.print("비밀번호 입력 : ");
String inputPw = sc.nextLine();
System.out.print("이름 입력 : ");
String inputName = sc.nextLine();
boolean flag = true;
for(Member member : members) {
// 단, 이미 중복되는 아이디가 존재하는 경우 가입 불가
if(member != null && member.getMemberId().equals(inputId)) {
System.out.println("[회원 가입 불가] 이미 존재하는 아이디입니다.");
flag = false;
}
}
if(flag) {
System.out.println("회원 가입이 완료되었습니다.");
// Member객체를 생성하여 members 리스트에 추가
members[memberCount] = new Member(inputId, inputPw, inputName);
memberCount++;
}
}
// [로그인]
/**
* 로그인
*/
public void login() {
System.out.println("[로그인]");
// 아이디, 비밀번호를 입력 받아
System.out.print("아이디 : ");
String inputId = sc.nextLine();
System.out.print("비밀번호 : ");
String inputPw = sc.nextLine();
boolean flag = true;
// 일치하는 회원이 members에 있을 경우 로그인
for(Member member : members) {
if(member.getMemberId().equals(inputId) && member.getMemberPw().equals(inputPw)) {
System.out.println(member.getMemberName() + "님 환영합니다.");
loginMember = member;
flag = false;
break;
}
if(flag) {
// 없으면 "아이디 또는 비밀번호가 일치하지 않습니다." 출력
System.out.println("아이디 또는 비밀번호가 일치하지 않습니다.");
}
}
}
}
package kh.edu.updown.model.service;
import java.util.List;
import java.util.Scanner;
import kh.edu.updown.model.vo.Member;
public class LoginService {
private Scanner sc = new Scanner(System.in);
public void startGame(Member loginMember) {
// 업다운 게임 시작
System.out.println("[Game Start...]");
int count = 0;
// 1 ~ 100 사이 숫자 중 랜덤하게 한 숫자를 지정하고 업/다운 게임을 진행
int random = (int)(Math.random()*100 + 1);
while(true) {
System.out.print((count+1) + "번째 입력 : ");
int input = sc.nextInt();
sc.nextLine();
count++;
if(input > random) {
System.out.println("-- DOWN --");
continue;
} else if(input < random) {
System.out.println("-- UP --");
continue;
} else if(input == random) {
System.out.println("정답!!");
System.out.println("입력 시도 횟수 : " + count);
// 맞춘 횟수가 현재 로그인한 회원의 최초 또는 최고 기록인 경우 회원의 highScore 필드 값을 변경
if(count < loginMember.getHighScore()) {
System.out.println("*** 최고 기록 달성 ***");
loginMember.setHighScore(count);
}
break;
}
}
}
// 내 정보 조회
// 로그인한 멤버의 정보 중 비밀번호를 제외한 나머지 정보만 화면에 출력
public void selectMyInfo(Member loginMember) {
System.out.println("[내 정보 조회]");
System.out.println("아이디 : " + loginMember.getMemberId());
System.out.println("이름 : " + loginMember.getMemberName());
System.out.println("최고 점수 : " + loginMember.getHighScore());
}
// 전체 회원 조회
// 전체 회원의 아이디, 이름, 최고점수를 출럭
public void selectAllMember(Member[] members) {
System.out.println("[전체 회원 조회]");
int index = 0;
if(members[0] == null) {
System.out.println("회원 정보가 없습니다.");
return;
}
for(Member member : members) {
if(member != null) {
System.out.println("[" + (index++) + "번]");
System.out.println("아이디 : " + member.getMemberId());
System.out.println("이름 : " + member.getMemberName());
System.out.println("최고 점수 : " + member.getHighScore());
}
}
}
// 비밀번호 변경
// 현재 비밀번호를 입력 받아
// 같은 경우에만 새 비밀번호를 입력 받아 비밀번호 변경
public void updatePassword(Member loginMember) {
System.out.println("[비밀번호 변경]");
System.out.print("비밀번호 입력 : ");
String inputPw = sc.nextLine();
if(loginMember.getMemberPw().equals(inputPw)) {
System.out.print("새로운 비밀번호 입력 : ");
String newPw = sc.nextLine();
loginMember.setMemberPw(newPw);
System.out.println("비밀번호 변경이 완료되었습니다.");
}
}
}
package kh.edu.updown.run;
import kh.edu.updown.model.service.MainService;
public class UpDownRun {
public static void main(String[] args) {
MainService service = new MainService();
service.displayMenu();
}
}
package kh.edu.updown.model.service;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
import kh.edu.updown.model.vo.Member;
public class MainService {
private Scanner sc = new Scanner(System.in);
// 회원 가입된 회원의 정보를 저장할 배열 선언 및 할당
private Member[] members = new Member[3];
private int memberCount = 0; // 현재 가입한 회원 수 (회원 가입 시 members 인덱스 지정에 사용 가능)
// 현재 로그인한 회원의 정보를 참조할 변수 선언.
private Member loginMember = null; // 로그인 X == null, 로그인 O != null
// LoginService 생성
// -> 로그인 시 이용할 수 있는 기능만을 모아둔 객체
private LoginService loginService = new LoginService();
// 메뉴 출력 메소드
// * 메뉴 출력 메소드를 분석해보세요!
public void displayMenu() {
int sel = 0; // 메뉴 선택용 변수
do {
try {
System.out.println();
System.out.println("=== UP/DOWN 게임 ===");
if(loginMember == null) { // 로그인이 되어있지 않은 경우
System.out.println("[메인 메뉴]");
System.out.println("1. 회원가입");
System.out.println("2. 로그인");
System.out.println("0. 종료");
System.out.print("메뉴 선택 >> ");
sel = sc.nextInt();
sc.nextLine(); // 입력 버퍼 개행문자 제거
System.out.println(); // 줄바꿈
switch(sel) {
case 1 : signUp(); break;
case 2 : login(); break;
case 0 : System.out.println("[프로그램 종료]"); break;
default : System.out.println("잘못 입력하셨습니다. 메뉴를 다시 선택해주세요.");
}
}else { // 로그인이 되어있는 경우
System.out.println("[로그인 메뉴]");
System.out.println("1. 업/다운 게임 start");
System.out.println("2. 내 정보 조회");
System.out.println("3. 전체 회원 조회");
System.out.println("4. 비밀번호 변경");
System.out.println("9. 로그아웃");
System.out.println("메뉴 선택 >> ");
sel = sc.nextInt();
sc.nextLine();
System.out.println();
// 선택된 메뉴 번호에 따라 LoginService에서 알맞은 기능을 호출
switch (sel) {
case 1: loginService.startGame(loginMember); break;
case 2: loginService.selectMyInfo(loginMember); break;
case 3: loginService.selectAllMember(members); break;
case 4: loginService.updatePassword(loginMember); break;
case 9 : System.out.println("[로그아웃 되었습니다.]");
loginMember = null; // loginMember 필드에 아무것도 참조하고 있지 않음을 의미하는 null을 대입
break;
default: System.out.println("잘못 입력하셨습니다. 메뉴를 다시 선택해주세요.");
}
}
}catch (InputMismatchException e) {
System.out.println("정수만 입력해주세요.");
sc.nextLine(); // 버퍼에 남아있는 문자열 제거
}
}while(sel != 0);
}
// [회원 가입]
// 아이디, 비밀번호, 이름을 입력 받고
// Member객체를 생성하여 members 리스트에 추가
// 단, 이미 중복되는 아이디가 존재하는 경우 가입 불가
public void signUp() {
System.out.println("[회원 가입]");
// memberCount가 members 배열 길이 이상인 경우 == 회원 가입 정원이 다 찬 상태
if(memberCount >= members.length) {
System.out.println("회원 정원이 가득 차서 더 이상 가입을 할 수 없습니다.");
} else { // 회원 가입이 가능한 경우
String memberId = null; // 아이디를 입력 받아 저장할 변수
while(true) {
System.out.print("아이디 : ");
memberId = sc.next();
boolean flag = true; // 중복 아이디 체크용 변수
for(int i=0; i<members.length; i++) {
if(members[i] != null) { // members 배열 요소가 null이 아닌 경우 == 회원 정보가 있는 경우
// 입력 받은 아이디와 같은 아이디가 members에 존재하는 경우
if(memberId.equals(members[i].getMemberId())) {
System.out.println("중복되는 아이디입니다. 다시 입력해 주세요.");
flag = false;
break; // 중복 검사 for문 종료
}
} else { // members 배열 요소가 null인 경우 == 회원 정보가 없는 경우
break; // 중복 검사 for문 종료
}
} // end for
if(flag) { // 중복 아이디가 아닌 경우
break; // 아이디를 반복적으로 입력 받은 while문 종료
}
} // end while
System.out.print("비밀번호 : ");
String memberPw = sc.next();
System.out.print("이름 : ");
String memberName = sc.next();
// 입력 받은 값을 이용해 새로운 Member 객체를 생성하고 members 배열의 요소 중
// memberCount번째 요소가 참조할 수 있도록 주소를 저장
members[memberCount] = new Member(memberId, memberPw, memberName);
// 새로운 회원이 가입되었으므로 memberCount를 1 증가
memberCount++;
System.out.println("***** 회원 가입이 완료되었습니다. *****");
} // end else (회원 가입이 가능한 경우)
} // end signUp()
// [로그인]
// 아이디, 비밀번호를 입력 받아 일치하는 회원이 members에 있을 경우 로그인
// 없으면 "아이디 또는 비밀번호가 일치하지 않습니다." 출력
public void login() {
System.out.println("[로그인]");
System.out.print("아이디 : ");
String inputId = sc.next();
System.out.print("비밀번호 : ");
String inputPw = sc.next();
for(int i=0; i<members.length; i++) {
if(members[i] != null) { // members 배열 요소가 null이 아닌 경우 == 회원 정보가 있는 경우
// members 배열 요소 중 입력 받은 아이디, 비밀번호가 일치하는 회원이 있을 경우
if(members[i].getMemberId().equals(inputId) && members[i].getMemberPw().equals(inputPw)) {
System.out.println(members[i].getMemberName() + " 님 환영합니다.");
loginMember = members[i]; // loginMember 필드에 일치하는 회원 객체의 주소를 얕은 복사
}
} else { // members 배열 요소가 null인 경우 == 회원 정보가 없는 경우
break;
}
} // end for
// 아이디, 비밀번호를 비교한 후에도 loginMember 필드가 null인 경우 == 로그인 실패
if(loginMember == null) {
System.out.println("아이디 또는 비밀번호가 일치하지 않습니다.");
}
} // end login()
}
package kh.edu.updown.model.service;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
import kh.edu.updown.model.vo.Member;
public class LoginService {
private Scanner sc = new Scanner(System.in);
// 업다운 게임 시작
// 1 ~ 100 사이 숫자 중 랜덤하게 한 숫자를 지정하고 업/다운 게임을 진행
// 맞춘 횟수가 현재 로그인한 회원의 최초 또는 최고 기록인 경우 회원의 highScore 필드 값을 변경
public void startGame(Member loginMember) {
System.out.println("[Game Start...]");
// 1 ~ 100 사이 난수 발생
int random = (int)(Math.random()*100 + 1);
int count = 0; // 입력 시도 횟수 카운트
try {
while(true) {
count++; // while문이 반복될 때마다 count를 1씩 증가시킴
System.out.print(count + "번째 입력 : ");
int input = sc.nextInt();
sc.nextLine();
if(random == input) { // 입력된 값이 발생한 난수와 같다면
System.out.println("정답!!");
System.out.println("입력 시도 횟수 : " + count);
// 입력 시도 횟수가 최초 또는 최고 기록인 경우
if(loginMember.getHighScore() == 0 || loginMember.getHighScore() > count ) {
System.out.println("***** 최고 기록 달성 *****");
// 매개변수로 전달 받은 loginMember의 highScore 필드에 시도 횟수 저장
loginMember.setHighScore(count);
}
break; // while문 종료
} else { // 입력된 값이 발생한 난수와 같지 않다면
if(random < input) {
System.out.println("-- DOWN --");
} else {
System.out.println("-- UP --");
}
}
}
} catch(InputMismatchException e) {
System.out.println("1~100 사이 정수만 입력해 주세요.");
sc.nextLine();
}
}
// 내 정보 조회
// 로그인한 멤버의 정보 중 비밀번호를 제외한 나머지 정보만 화면에 출력
public void selectMyInfo(Member loginMember) {
System.out.println("[내 정보 조회]");
System.out.println("아이디 : " + loginMember.getMemberId());
System.out.println("이름 : " + loginMember.getMemberName());
System.out.println("최고점수 : " + loginMember.getHighScore() + "회");
}
// 전체 회원 조회
// 전체 회원의 아이디, 이름, 최고점수를 출럭
public void selectAllMember(Member[] members) {
System.out.println("[전체 회원 조회]");
System.out.printf("%6s %6s %7s\n", "[아이디]", "[이름]", "[최고 점수]");
for(int i=0; i<members.length; i++) {
if(members[i] != null) { // members 배열 요소에 저장된 회원 정보가 있는 경우
System.out.printf("%7s %6s %6d\n", members[i].getMemberId(), members[i].getMemberName(),
members[i].getHighScore());
}
}
}
// 비밀번호 변경
// 현재 비밀번호를 입력 받아
// 같은 경우에만 새 비밀번호를 입력 받아 비밀번호 변경
public void updatePassword(Member loginMember) {
System.out.println("[비밀번호 변경]");
System.out.print("현재 비밀번호 입력 : ");
String currentPw = sc.next();
if(currentPw.equals(loginMember.getMemberPw())) {
System.out.print("새 비밀번호 : ");
String newPw = sc.next();
loginMember.setMemberPw(newPw);
System.out.println("비밀번호가 변경되었습니다.");
} else {
System.out.println("현재 비밀번호가 일치하지 않습니다.");
}
}
}