본문 바로가기
카테고리 없음

java 주소록 예제 실습

by prlkt5200 2024. 9. 20.
반응형

한번 연습해본 예제인데, 이해는 되는데 구현이 조금이 아쉽게 됩니다.

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();
	}
}
반응형