반응형
한번 연습해본 예제인데, 이해는 되는데 구현이 조금이 아쉽게 됩니다.
package package1;
public class App {
public static void main(String[] args) {
//AddressManager 객체를 만들어준다.
//그 객체 안에 run()메소드를 실행시켜준다.
AddressManager addressManager = new AddressManager();
addressManager.run();
}
}
package package1;
public class User {
//유저객체의 정보 또는 상태를 의미하는 변수들이다. 그리고 그 변수들은, 생성자를 통해서 초기화한다.
private String name;
private String id;
private String pw;
private String phone;
private String address;
boolean login_state = false;
public User(String pname, String pid, String ppw, String pphone, String paddress) {
this.name= pname;
this.id=pid;
this.pw=ppw;
this.phone=pphone;
this.address=paddress;
}
//id 하고 pw만 변경하는 생성자이다.
public User(String pid, String ppw) {
this.id = pid;
this.pw = ppw;
}
//로그인 스테이트를 반환한다.
public boolean isLogin() {
return this.login_state;
}
//로그인에 성공하였을 때
public boolean setLogin() {
return this.login_state=true;
}
//로그아웃을 시도할 때
public void logout() {
this.login_state=false;
}
String getPw() {
return this.pw;
}
public void setPw(String ppw) {
this.pw=ppw;
}
String getPhone() {
return this.phone;
}
public void setPhone(String pphone) {
this.phone = pphone;
}
String getAddress() {
return this.address;
}
public void setAddress(String paddress) {
this.address=paddress;
}
String getName() {
return this.name;
}
String getId() {
return this.id;
}
}
package package1;
import java.util.Scanner;
public class MenuManager {
//각 상수들은 스위치 케이스 문에서 사용될 것이다.
public final static int LOGIN=1;
public final static int EXIT=2;
public final static int ADDRESS_SEARCH=1;
public final static int ALL_ADDRESS_SEARCH=2;
public final static int LOGOUT=3;
public void MenuManager() {
}
//여기서 재미있는 것이 메뉴창에 보이는 화면을 구현할 메소드이다. 쉬워서 보기가 좋다.
//이것은 시작 메뉴화면이다.
public void initMenu() {
System.out.println("<< 주소록 관리 >>");
System.out.println("1. 로그인");
System.out.println("2. 종료");
}
//이것은 로그인하고 나서의 메뉴화면이다.
public void addressMenu() {
System.out.println("<< 주소록 관리 >>");
System.out.println("1. 주소록 검색");
System.out.println("2. 전체 주소록 검색");
System.out.println("3. 로그아웃");
}
//이 두 메소드로 select 값을 필터링 해준다. 만약 잘못된 값이 입력이 되면, 메뉴선택이 잘못되었다는 결과가 나오게 된다.
public int selectInitMenu() {
Scanner input = new Scanner(System.in);
int select;
while(true) {
select = input.nextInt();
input.nextLine();
if(select<LOGIN || select>EXIT ) {
System.out.println("메뉴 선택이 잘못되었습니다.");
continue;
}
break;
}
return select;
}
public int selectAddressMenu() {
Scanner input = new Scanner(System.in);
int select;
while(true) {
select = input.nextInt();
input.nextLine();
if(select<ADDRESS_SEARCH || select>LOGOUT) {
System.out.println("메뉴 선택이 잘못되었습니다.");
continue;
}
break;
}
return select;
}
}
package package1;
import java.util.Scanner;
public class AddressManager {
// 메뉴 매니저 객체를 불러올 변수이다. 생성자에서 초기화 할 것이다.
private MenuManager menuManager = null;
// 유저 객체를 저장할 유저 배열이다.
private User[] userList = null;
// 유저 객체이다.
private User user = null;
// 유저의 수를 정한 상수이다.
private final int ADDRESS_COUNT = 3;
// app에서 addressManager 객체를 만들었을 때, 이 생성자를 호출하면서 메뉴 매니저 객체를 만들고
// 유저 리스트 객체 생성과 함께 유저 객체를 넣어준다.
public AddressManager() {
this.menuManager = new MenuManager();
this.userList = new User[3];
userList[0] = new User("aaa", "aaa1", "aaa1234", "11111111", "서울");
userList[1] = new User("bbb", "bbb2", "bbb1234", "22222222", "부산");
userList[2] = new User("ccc", "ccc3", "ccc1234", "33333333", "광주");
}
// 본격적으로 실행하는 메소드이다.
public void run() {
// while문을 빠져나오기 위한 변수이다.
boolean end_flag = false;
while (true) {
// 메뉴 매니저 객체의 창을 띄워준다.
this.menuManager.initMenu();
// 반환받은 셀렉트 값을 select 변수에 저장해준다.
int select = this.menuManager.selectInitMenu();
switch (select) {
// 애초에 반환받아서 저장할 때 한번 필터를 해준다. 그래서 LOGIN과 EXIT만 나오게 한다.
case MenuManager.LOGIN:
// 로그인 프로세스 실행 후에 성공하면 바로 address 프로세스가 실행이 되게 한다.
if (this.loginProcess()) {
// 어드레스 메소드 실행
this.addressProcess();
}
break;
case MenuManager.EXIT:
end_flag = true;
break;
}
if (end_flag) {
break;
}
}
}
// 로그인 과정의 메소드이다.
public boolean loginProcess() {
Scanner input = new Scanner(System.in);
System.out.print("ID : ");
String id = input.nextLine();
System.out.print("PW : ");
String pw = input.nextLine();
// user 클래스의 id pw 두개의 매개변수만 받는 생성자는 바로 로그인을 위해서 활용을 한다.
// 로그인 때 사용할 비교용 객체이다.
this.user = new User(id, pw);
for (int i = 0; i < ADDRESS_COUNT; i++) {
// 이 비교용 객체의 id와 pw를 userlist에 저장된 유저의 정보와 비교한다.
if (this.user.getId().equals(this.userList[i].getId())
&& this.user.getPw().equals(this.userList[i].getPw())) {
// 성공시 로그인
return user.setLogin();
}
}
System.out.println("계정정보가 틀렸습니다. ");
return false;
}
public void addressProcess() {
boolean end_flag = false;
while (true) {
// 먼저 어드레스 메뉴창을 띄워준다.
this.menuManager.addressMenu();
// 로그인과 동일하게 올바른 셀렉트 값을 반환받는다.
int select = this.menuManager.selectAddressMenu();
switch (select) {
// 반환받은 셀렉트 값이 특정 상수 값과 매치시 안의 메소드가 실행된다.
case MenuManager.ADDRESS_SEARCH:
this.addressSearch();
break;
case MenuManager.ALL_ADDRESS_SEARCH:
this.allAddressSearch();
break;
case MenuManager.LOGOUT:
// 여기 객체의 로그아웃 메소드를 타고 가면 아까 생성해둔, 이 객체의 로그인 프로세스 메소드를 통해 만들어낸 유저객체의 로그아웃메소드로
// false 값을 반환받는다.
this.logout();
// 그리고 end flag로 while문을 빠져나온다.
end_flag = true;
break;
}
if (end_flag) {
break;
}
}
}
public void addressSearch() {
Scanner input = new Scanner(System.in);
System.out.print("검색할 유저의 이름 : ");
String name = input.nextLine();
// 잘못된 값을 입력받을 때 사용할 변수이다.
boolean flag = false;
for (int i = 0; i < this.ADDRESS_COUNT; i++) {
if (this.userList[i].getName().equals(name)) {
System.out.println(name + "님의 주소 : " + userList[i].getAddress());
System.out.println(name + "님의 전화번호 : " + userList[i].getPhone());
flag = true;
break;
}
}
// 위에 flag가 바로 여기서 사용이 되는 것이다.
if (!flag) {
System.out.println("입력하신 유저는 없는 유저거나 잘못 입력하셨습니다.");
}
}
public void allAddressSearch() {
for (int i = 0; i < this.ADDRESS_COUNT; i++) {
System.out.println(userList[i].getName() + "님의 주소 : " + userList[i].getAddress());
System.out.println(userList[i].getName() + "님의 전화번호 : " + userList[i].getPhone());
}
}
public void logout() {
// 여기서 활용하는 유저 객체는 아까 로그인 하기 위해 생성한 비교용 유저 객체이다.
this.user.logout();
}
}
반응형