[필기정리]Day18 - 전화번호 관리 프로그램 문제 06단계

SW/Java

2020. 7. 3. 14:43

Q. 전화번호 관리 프로그램 06단계 문제
우리가 직접 예외의 상황을 정의하고, 

해당 예외의 표현을 위한 예외 클래스를 정의해서 단계별 프로젝트에 반영해보고자 한다. 
- 초기 메뉴 선택에서 1, 2, 3, 4 이외의 값을 입력하는 예외상황
- 데이터 입력의 과정에서 1, 2, 3 이외의 값을 입력하는 예외상황

이 두 가지 예외상황 모두 그 유형이 동일하니, 

MenuChoiceException이라는 이름의 예외 클래스를 하나 정의해서 위의 두 상황에 모두 활용하기로 하겠다. 

그리고 위의 두 가지 중 어느 예외상황이 발생을 하건, 

프로그램의 흐름은 '초기 메뉴 선택'으로 이동하는 것을 원칙으로 하자.

실행 예

선택하세요...
1. 데이터 입력
2. 데이터 검색
3. 데이터 삭제
4. 프로그램 종료
선택 : 5
5에 해당하는 선택은 존재하지 않습니다.
메뉴 선택을 처음부터 다시 진행합니다.

실행 예

선택하세요...
1. 데이터 입력
2. 데이터 검색
3. 데이터 삭제
4. 프로그램 종료
선택 : 1
데이터 입력을 시작합니다.
1. 일반 2. 대학 3. 회사
선택>>4
4에 해당하는 선택은 존재하지 않습니다.
메뉴 선택을 처음부터 다시 진행합니다.

선택하세요...
1. 데이터 입력
2. 데이터 검색
3. 데이터 삭제
4. 프로그램 종료
선택 : 

 

A.

class MenuChoiceException extends Exception
{
	private int choice;
	MenuChoiceException(int choice)
	{
		super("유효하지 않은 메뉴 값입니다.");
		this.choice = choice;
	}
	public void showWrongMenu()
	{
		System.out.println( choice + "에 해당하는 선택은 존재하지 않습니다.");
		System.out.println("메뉴 선택을 처음부터 다시 진행합니다.");
	}
}
class PhoneInfo
{
	private String name;
	private String phone;

	PhoneInfo(String name, String phone)
	{
		this.name = name;
		this.phone = phone;
	}
	public String getName()
	{
		return name;
	}
	public void showPhoneInfo()
	{
		System.out.println("이름 : " + name);
		System.out.println("전화번호 : " + phone);
	}
}

class PhoneUnivInfo extends PhoneInfo
{
	private String major;
	private int year;

	PhoneUnivInfo(String name ,String phone, String major, int year)
	{
		super(name, phone);
		this.major = major;
		this.year = year; 
	}
	public void showPhoneInfo()
	{
		super.showPhoneInfo();
		System.out.println("전공 : " + major);
		System.out.println("학년 : " + year);
	}
}

class PhoneCompanyInfo extends PhoneInfo
{
	private String company;

	PhoneCompanyInfo(String name ,String phone, String company)
	{
		super(name, phone);
		this.company = company;
	}
	public void showPhoneInfo()
	{
		super.showPhoneInfo();
		System.out.println("회사 : " + company);
	}
}
class PhoneBook
{
	private static PhoneBook pb;
	private PhoneInfo[] pInfo;
	private int cntOfPhone;
	private int sizePhoneInfo;
	PhoneBook(int sizePhoneInfo)
	{
		pInfo = new PhoneInfo[sizePhoneInfo];
		cntOfPhone = 0;
		this.sizePhoneInfo = sizePhoneInfo;
	}
	public static PhoneBook getPhoneBookInst(int sizePhoneInfo)
	{
		if(pb == null)
			pb = new PhoneBook(sizePhoneInfo);
		return pb;
	}
	public void inputPhoneInfo(PhoneInfo pInfo)
	{
		int i = 0, j=0;
		if(cntOfPhone >= sizePhoneInfo)
		{
			System.out.println("더 이상 저장할 수 없습니다.");
			return;
		}
		for(i=0;i<cntOfPhone;i++)
		{
			if(this.pInfo[i].getName().compareTo(pInfo.getName()) > 0)
			{
				for(j=cntOfPhone-1;j>=i;j--)
				{
					this.pInfo[j+1] = this.pInfo[j];
				}
				break;
			}
		}
		this.pInfo[i] = pInfo;
		cntOfPhone++;
	}
	public void searchPhoneInfo(String name)
	{
		int result = search(name);
		if(result != -1)
			pInfo[result].showPhoneInfo();
		else
			System.out.println("찾으시는 데이터가 없습니다.");
	}
	public void deletePhoneInfo(int idx)
	{
		int i=0;
		for(i=idx;i<cntOfPhone-1;i++)
			pInfo[i] = pInfo[i+1];
		pInfo[i] = null;
		cntOfPhone--;
		System.out.println("삭제가 완료되었습니다.");
	}


	public int search(String name)
	{
		for(int i=0;i<cntOfPhone;i++)
		{
			if(pInfo[i].getName().compareTo(name) == 0)
				return i;
		}
		return -1;		
	}

	public void showAllPhoneInfo()
	{
		for(int i=0;i<cntOfPhone;i++)
			pInfo[i].showPhoneInfo();
	}
}
interface PhoneMenuString
{
	int INPUT_PHONEINFO = 1;
	int SEARCH_PHONEINFO = 2;
	int DELETE_PHONEINFO = 3;
	int SHOW_ALL_PHONEINFO = 4;
	int PROGRAM_QUIT = 5;

	int GENERAL 	= 1;
	int UNIVERCITY 	= 2;
	int COMPANY 	= 3;

	int YES = 1;
	int NO = 2;
}
class PhoneUI
{
	private static final int MAX_CNT=100;
	public static Scanner sc = new Scanner(System.in);
	private static PhoneBook pb = PhoneBook.getPhoneBookInst(MAX_CNT);



	public static void mainMenu()
	{
		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.print("선택 : ");
	}

	public static void inputMenu()
	{
		System.out.println("1. 일반, 2. 대학, 3. 회사");
	}
	public static void inputMenuChoice() throws MenuChoiceException
	{
		int choice=0;
		choice = sc.nextInt();
		sc.nextLine();
		if(choice < PhoneMenuString.GENERAL || choice > PhoneMenuString.COMPANY)
			throw new MenuChoiceException(choice);
		switch(choice)
		{
		case PhoneMenuString.GENERAL:
			inputGeneralPhoneInfo();
			break;
		case PhoneMenuString.UNIVERCITY:
			inputUniversityPhoneInfo();
			break;
		case PhoneMenuString.COMPANY:
			inputCompanyPhoneInfo();
			break;
		}
	}

	public static void inputGeneralPhoneInfo()
	{
		String name;
		String phone;

		System.out.println("데이터 입력을 시작합니다.");
		System.out.print("이름 : ");
		name = sc.nextLine();
		System.out.print("전화번호 : ");
		phone = sc.nextLine();
		System.out.println("데이터 입력이 완료되었습니다.");
		pb.inputPhoneInfo( new PhoneInfo(name, phone) );
	}

	public static void inputUniversityPhoneInfo()
	{
		String name;
		String phone;
		String major;
		int year;

		System.out.println("데이터 입력을 시작합니다.");
		System.out.print("이름 : ");
		name = sc.nextLine();
		System.out.print("전화번호 : ");
		phone = sc.nextLine();
		System.out.print("전공 : ");
		major = sc.nextLine();
		System.out.print("학년 : ");
		year = sc.nextInt();
		sc.nextLine();
		System.out.println("데이터 입력이 완료되었습니다.");
		pb.inputPhoneInfo( new PhoneUnivInfo(name, phone, major, year) );
	}

	public static void inputCompanyPhoneInfo()
	{
		String name;
		String phone;
		String company;

		System.out.println("데이터 입력을 시작합니다.");
		System.out.print("이름 : ");
		name = sc.nextLine();
		System.out.print("전화번호 : ");
		phone = sc.nextLine();
		System.out.print("회사 : ");
		company = sc.nextLine();
		System.out.println("데이터 입력이 완료되었습니다.");
		pb.inputPhoneInfo( new PhoneCompanyInfo(name, phone, company) );
	}

	public static void searchPhoneInfo()
	{
		String name;
		System.out.println("데이터 검색을 시작합니다.");
		System.out.println("검색하시고자 하는 이름을 입력하세요.");
		name = sc.nextLine();
		pb.searchPhoneInfo(name);			
	}
	public static void deletePhoneInfo()
	{
		String name;
		int result=0;
		int answer=0;
		System.out.println("검색하시고자 하는 이름을 입력하세요.");		
		name = sc.nextLine();		
		result = pb.search(name);
		if(result != -1)
		{
			System.out.println("정말 삭제하시겠습니까? 1. Yes 2. No");
			answer = sc.nextInt();
			sc.nextLine();
			switch(answer)
			{
			case PhoneMenuString.YES:
				pb.deletePhoneInfo(result);
				break;
			case PhoneMenuString.NO:
				break;
			default:
				System.out.println("잘못 누르셨습니다.");
			}
		}
		else
			System.out.println("삭제하시려는 데이터가 없습니다.");
	}
	public static void showAllPhoneInfo()
	{
		pb.showAllPhoneInfo();
	}
}
import java.util.Scanner;
class PhoneMain
{		
	public static void main(String[] args)
	{
		int choice=0;

		while(true)
		{			
			try
			{
				PhoneUI.mainMenu();
				choice = PhoneUI.sc.nextInt();
				PhoneUI.sc.nextLine();
				if(choice < PhoneMenuString.INPUT_PHONEINFO || choice > PhoneMenuString.PROGRAM_QUIT)
					throw new MenuChoiceException(choice);

				switch(choice)
				{
					case PhoneMenuString.INPUT_PHONEINFO:
						PhoneUI.inputMenu();
						PhoneUI.inputMenuChoice();
						break;
					case PhoneMenuString.SEARCH_PHONEINFO:
						PhoneUI.searchPhoneInfo();
						break;
					case PhoneMenuString.DELETE_PHONEINFO:
						PhoneUI.deletePhoneInfo();
						break;
					case PhoneMenuString.SHOW_ALL_PHONEINFO:
						PhoneUI.showAllPhoneInfo();
						break;
					case PhoneMenuString.PROGRAM_QUIT:
						return;
			
				}
			}
			catch(MenuChoiceException e)
			{
				System.out.println(e.getMessage());
				e.showWrongMenu();
			}					
		}
	}
}

 

728x90