[필기정리]Day22 - 문제 전화번호부 단계 7

SW/Java

2020. 7. 9. 17:43

Q. 단계별 프로젝트 07단계

   단계별 프로젝트 03단계에서는 동명이인의 데이터가 존재하지 않는다고 가정했지만, 

   배열을 대상으로 저장이 이뤄졌기 때문에,

   사실상 동명이인의 데이터가 저장되는 상황을 막지는 못했다.

   따라서 이번 단계에서는 동일한 데이터의 저장을 허용하지 않는 HashSet<E> 클래스를 대상으로

   저장이 이뤄지도록 프로젝트를 변경하고자 한다.

   그리고 이 과정에서 동일한 인스턴스의 기준을 다음과 같이 정의하고자 한다.

   (HashSet 구현 후 TreeSet도 구현해 본다.) 

"전화번호만 같으면, 그 이외의 정보가 아무리 달라도 동일한 데이터로(인스턴스로) 간주한다." 

실행 예 

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


데이터 입력을 시작합니다. 
1. 일반 2. 대학 3. 회사 
선택>> 1 
이름 : 조한석 
전화번호 : 011-222-4444 
데이터 입력이 완료되었습니다. 

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


선택 : 1 
데이터 입력을 시작합니다. 
1. 일반 2. 대학 3. 회사 
선택>> 2 
이름 : 조한석 
전화번호 : 011-222-4444 
전공 : 전자공학 
학년 : 1 
이미 저장된 데이터 입니다. 

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

 

A. HashSet 풀이

public interface Menu {
	int INSERT_PHONE_INFO=1; 		// 상수로 준 이유 : 가독성을 높이기 위해서
	int SEARCH_PHONE_INFO=2;
	int DELETE_PHONE_INFO=3;
	int SHOW_ALL_PHONE_INFO=4;
	int QUIT_PHONE_INFO=5;
}
public class MenuChoiceException extends Exception {
	
	public MenuChoiceException(int menu)
	{		
		super(menu + "에 해당하는 선택은 존재하지 않습니다.\n" + 
				"메뉴 선택을 처음부터 다시 진행합니다.");
	}
}
import java.util.HashSet;
import java.util.Iterator;

public class PhoneBook {

	private static PhoneBook pb;
	private HashSet<PhoneInfo> set;
	private Iterator<PhoneInfo> itr;

	private PhoneBook() 
	{
		set = new HashSet<PhoneInfo>();
	}

	public static PhoneBook getPhoneBook()
	{
		if(pb==null)
			pb = new PhoneBook();
		return pb;
	}

	public boolean insertPhoneInfo(PhoneInfo phoneInfo)
	{		
		return set.add(phoneInfo);
	}

	public boolean searchPhoneInfoByName(String name)
	{
		PhoneInfo pInfo = null;
		itr = set.iterator();
		boolean result = false;

		while(itr.hasNext())
		{			
			pInfo = itr.next(); // 첫 번째 객체의 주소를 반환시키는 것
			if(pInfo.getName().equals(name)) 
			{
				pInfo.printCurrentState();
				result = true;
			} // break 없는 것은 동명이인의 데이터까지 출력하기 위해서
		}

		return result;
	}

	public boolean deletePhoneInfoByPhoneNumber(String phoneNumber)
	{
		PhoneInfo pInfo = null;
		itr = set.iterator();

		while(itr.hasNext())
		{			
			pInfo = itr.next();
			if(pInfo.getPhoneNumber().equals(phoneNumber))
			{
				itr.remove();
				return true;
			}
		}
		return false;
	}

	public void printAllPhoneInfo()
	{
		itr = set.iterator();
		while(itr.hasNext())
		{
			itr.next().printCurrentState();
		}
	}
}

 

import java.util.Scanner;

public class PhoneBookUI {
	private PhoneBook pb;
	public static Scanner sc = new Scanner(System.in);
	
	public PhoneBookUI()
	{
		this.pb = PhoneBook.getPhoneBook();
	}
	
	public void printMenu()
	{
		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("선택 : ");
	}
	
	public void inputMenu()
	{
		System.out.println("데이터 입력을 시작합니다.");
		System.out.println("1. 일반, 2. 대학, 3. 회사");
		System.out.print("선택 >>");
	}
	
	public void inputPhoneInfo(int menu)
	{
		String name, phoneNumber, major, company;
		int year=0;
		boolean result;
		PhoneInfo phoneInfo = null;
		
		System.out.println("데이터 입력을 시작합니다.");
		System.out.println("이름 : ");
		name = sc.nextLine();
		System.out.println("전화번호 : ");
		phoneNumber = sc.nextLine();
		
		if(menu == 1)	// 추가
			phoneInfo = new PhoneInfo(name, phoneNumber);
		else if(menu == 2)
		{
			System.out.println("전공 : ");
			major = sc.nextLine();
			System.out.println("학년 : ");
			year = sc.nextInt();
			phoneInfo = new PhoneUnivInfo(name, phoneNumber, major, year);
		}
		else if(menu==3)
		{
			System.out.println("회사 : ");
			company = sc.nextLine();
			phoneInfo = new PhoneCompanyInfo(name, phoneNumber, company);
		}
		result = pb.insertPhoneInfo(phoneInfo);
		if(result == false)
			System.out.println("이미 등록된 데이터 입니다.");
		else System.out.println("데이터 입력이 완료되었습니다.");
	}
	
	public void searchPhoneInfoByName()
	{
		String name;
		System.out.println("검색하시고자 하는 이름을 입력해 주세요.");
		name = sc.nextLine();
		System.out.println("사용자 검색을 시작합니다.");
		if( !pb.searchPhoneInfoByName(name)) System.out.println("찾으시는 사용자가 없습니다.");
	}
	
	public void deletePhoneInfoByPhoneNumber()
	{
		String phoneNumber;
		System.out.println("삭제하시고자 하는 전화번호를 입력해 주세요.");
		phoneNumber = sc.nextLine();
		boolean result = pb.deletePhoneInfoByPhoneNumber(phoneNumber);
		if(result) System.out.println("삭제가 완료되었습니다.");
		else System.out.println("삭제하시고자 하는 전화번호 정보가 없습니다.");
	}
	
	public void printAllPhoneInfo()
	{
		System.out.println("모든 사용자 정보를 출력합니다.");
		pb.printAllPhoneInfo();
	}
	
	public void quitProgram()
	{
		System.out.println("프로그램을 종료합니다.");
		sc.close();
	}
}
public class PhoneCompanyInfo extends PhoneInfo {

	private String company;

	public PhoneCompanyInfo(String name, String phoneNumber, String company) {
		super(name, phoneNumber);
		this.company = company;
	}

	@Override
	public void printCurrentState() {
		super.printCurrentState();
		System.out.println("회사 : " + company);
	}
	
}
public class PhoneInfo {
	private String name;
	private String phoneNumber;
	
	public PhoneInfo(String name, String phoneNumber) {
		this.name = name;
		this.phoneNumber = phoneNumber;
	}
	
	public String getName() {
		return name;
	}

	public String getPhoneNumber() {
		return phoneNumber;
	}

	public void printCurrentState()
	{
		System.out.println("이름 : "  + name);
		System.out.println("전화번호 : "  + phoneNumber);
	}

	@Override
	public boolean equals(Object obj) {
		return phoneNumber.equals(((PhoneInfo)obj).phoneNumber);
	}

	@Override
	public int hashCode() {
		return phoneNumber.hashCode();
	}
}
import java.util.Scanner;

public class PhoneMain{
	
	public static void main(String[] args) {
		
		int menu=0;		
		PhoneBookUI pbUI = new PhoneBookUI();
		Scanner sc = PhoneBookUI.sc;
		
		while(true)
		{
			pbUI.printMenu();			
			try
			{
				menu = sc.nextInt();
				sc.nextLine();
				
				if(menu<Menu.INSERT_PHONE_INFO || menu > Menu.QUIT_PHONE_INFO)
				{
					throw new MenuChoiceException(menu);
				}
				switch(menu)
				{
				case Menu.INSERT_PHONE_INFO:
					pbUI.inputMenu();
					menu = sc.nextInt();
					sc.nextLine();
					if(menu<1 || menu > 3)
					{
						throw new MenuChoiceException(menu);
					}
					pbUI.inputPhoneInfo(menu);
					break;
				case Menu.SEARCH_PHONE_INFO:
					pbUI.searchPhoneInfoByName();
					break;
				case Menu.DELETE_PHONE_INFO:
					pbUI.deletePhoneInfoByPhoneNumber();
					break;
				case Menu.SHOW_ALL_PHONE_INFO:
					pbUI.printAllPhoneInfo();
					break;
				case Menu.QUIT_PHONE_INFO:
					pbUI.quitProgram();
					return;				
				}				
			}
			catch(MenuChoiceException e)
			{
				System.out.println(e.getMessage());
			}
		}
	}
}
public class PhoneUnivInfo extends PhoneInfo {
	private String major;
	private int year;
	
	public PhoneUnivInfo(String name, String phoneNumber, String major, int year) {
		super(name, phoneNumber);
		this.major = major;
		this.year = year;
	}

	@Override
	public void printCurrentState() {
		super.printCurrentState();
		System.out.println("전공 : " + major);
		System.out.println("학년 : " + year);
	}
}

 

A. TreeSet 풀이

public interface Menu {
	int INSERT_PHONE_INFO=1; 		// 상수로 준 이유 : 가독성을 높이기 위해서
	int SEARCH_PHONE_INFO=2;
	int DELETE_PHONE_INFO=3;
	int SHOW_ALL_PHONE_INFO=4;
	int QUIT_PHONE_INFO=5;
}
public class MenuChoiceException extends Exception {
	
	public MenuChoiceException(int menu)
	{		
		super(menu + "에 해당하는 선택은 존재하지 않습니다.\n" + 
				"메뉴 선택을 처음부터 다시 진행합니다.");
	}
}
import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;

public class PhoneBook {

	private static PhoneBook pb;
	private TreeSet<PhoneInfo> set;
	private Iterator<PhoneInfo> itr;

	private PhoneBook() 
	{
		set = new TreeSet<PhoneInfo>();
	}

	public static PhoneBook getPhoneBook()
	{
		if(pb==null)
			pb = new PhoneBook();
		return pb;
	}

	public boolean insertPhoneInfo(PhoneInfo phoneInfo)
	{		
		return set.add(phoneInfo);
	}

	public boolean searchPhoneInfoByName(String name)
	{
		PhoneInfo pInfo = null;
		itr = set.iterator();
		boolean result = false;

		while(itr.hasNext())
		{			
			pInfo = itr.next();
			if(pInfo.getName().equals(name))
			{
				pInfo.printCurrentState();
				result = true;
			}
		}

		return result;
	}

	public boolean deletePhoneInfoByPhoneNumber(String phoneNumber)
	{
		PhoneInfo pInfo = null;
		itr = set.iterator();

		while(itr.hasNext())
		{			
			pInfo = itr.next();
			if(pInfo.getPhoneNumber().equals(phoneNumber))
			{
				itr.remove();
				return true;
			}
		}
		return false;
	}

	public void printAllPhoneInfo()
	{
		itr = set.iterator();
		while(itr.hasNext())
		{
			itr.next().printCurrentState();
            
            // for(PhoneInfo info:set)          위의 내용과 동일표현
            // 	 info.PrintCurrentState();
		}
	}
}
import java.util.Scanner;

public class PhoneBookUI {
	private PhoneBook pb;
	public static Scanner sc = new Scanner(System.in);
	
	public PhoneBookUI()
	{
		this.pb = PhoneBook.getPhoneBook();
	}
	
	public void printMenu()
	{
		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("선택 : ");
	}
	
	public void inputMenu()
	{
		System.out.println("데이터 입력을 시작합니다.");
		System.out.println("1. 일반, 2. 대학, 3. 회사");
		System.out.print("선택 >>");
	}
	
	public void inputPhoneInfo(int menu)
	{
		String name, phoneNumber, major, company;
		int year=0;
		boolean result;
		PhoneInfo phoneInfo = null;
		
		System.out.println("데이터 입력을 시작합니다.");
		System.out.println("이름 : ");
		name = sc.nextLine();
		System.out.println("전화번호 : ");
		phoneNumber = sc.nextLine();
		
		if(menu == 1)	// 추가
			phoneInfo = new PhoneInfo(name, phoneNumber);
		else if(menu == 2)
		{
			System.out.println("전공 : ");
			major = sc.nextLine();
			System.out.println("학년 : ");
			year = sc.nextInt();
			phoneInfo = new PhoneUnivInfo(name, phoneNumber, major, year);
		}
		else if(menu==3)
		{
			System.out.println("회사 : ");
			company = sc.nextLine();
			phoneInfo = new PhoneCompanyInfo(name, phoneNumber, company);
		}
		result = pb.insertPhoneInfo(phoneInfo);
		if(result == false)
			System.out.println("이미 등록된 데이터 입니다.");
		else System.out.println("데이터 입력이 완료되었습니다.");
	}
	
	public void searchPhoneInfoByName()
	{
		String name;
		System.out.println("검색하시고자 하는 이름을 입력해 주세요.");
		name = sc.nextLine();
		System.out.println("사용자 검색을 시작합니다.");
		if( !pb.searchPhoneInfoByName(name)) System.out.println("찾으시는 사용자가 없습니다.");
	}
	
	public void deletePhoneInfoByPhoneNumber()
	{
		String phoneNumber;
		System.out.println("삭제하시고자 하는 전화번호를 입력해 주세요.");
		phoneNumber = sc.nextLine();
		boolean result = pb.deletePhoneInfoByPhoneNumber(phoneNumber);
		if(result) System.out.println("삭제가 완료되었습니다.");
		else System.out.println("삭제하시고자 하는 전화번호 정보가 없습니다.");
	}
	
	public void printAllPhoneInfo()
	{
		System.out.println("모든 사용자 정보를 출력합니다.");
		pb.printAllPhoneInfo();
	}
	
	public void quitProgram()
	{
		System.out.println("프로그램을 종료합니다.");
		sc.close();
	}
}
public class PhoneCompanyInfo extends PhoneInfo {

	private String company;

	public PhoneCompanyInfo(String name, String phoneNumber, String company) {
		super(name, phoneNumber);
		this.company = company;
	}

	@Override
	public void printCurrentState() {
		super.printCurrentState();
		System.out.println("회사 : " + company);
	}
	
}
public class PhoneInfo implements Comparable<PhoneInfo>{
	private String name;
	private String phoneNumber;
	
	public PhoneInfo(String name, String phoneNumber) {
		this.name = name;
		this.phoneNumber = phoneNumber;
	}
	
	public String getName() {
		return name;
	}

	public String getPhoneNumber() {
		return phoneNumber;
	}

	public void printCurrentState()
	{
		System.out.println("이름 : "  + name);
		System.out.println("전화번호 : "  + phoneNumber);
	}

	@Override
	public boolean equals(Object obj) { // TreeSet에서는 크게 신경쓰지 않아도 된다
		return phoneNumber.equals(((PhoneInfo)obj).phoneNumber);
	}

	@Override
	public int hashCode() {
		return phoneNumber.hashCode();
	}

	@Override
	public int compareTo(PhoneInfo pInfo) { // 정렬을 원하는 기준으로 여기에 넣는 것!
		return name.compareTo(pInfo.name); 
	}
}
import java.util.Scanner;

public class PhoneMain{
	
	public static void main(String[] args) {
		
		int menu=0;		
		PhoneBookUI pbUI = new PhoneBookUI();
		Scanner sc = PhoneBookUI.sc;
		
		while(true)
		{
			pbUI.printMenu();			
			try
			{
				menu = sc.nextInt();
				sc.nextLine();
				
				if(menu<Menu.INSERT_PHONE_INFO || menu > Menu.QUIT_PHONE_INFO)
				{
					throw new MenuChoiceException(menu);
				}
				switch(menu)
				{
				case Menu.INSERT_PHONE_INFO:
					pbUI.inputMenu();
					menu = sc.nextInt();
					sc.nextLine();
					if(menu<1 || menu > 3)
					{
						throw new MenuChoiceException(menu);
					}
					pbUI.inputPhoneInfo(menu);
					break;
				case Menu.SEARCH_PHONE_INFO:
					pbUI.searchPhoneInfoByName();
					break;
				case Menu.DELETE_PHONE_INFO:
					pbUI.deletePhoneInfoByPhoneNumber();
					break;
				case Menu.SHOW_ALL_PHONE_INFO:
					pbUI.printAllPhoneInfo();
					break;
				case Menu.QUIT_PHONE_INFO:
					pbUI.quitProgram();
					return;				
				}				
			}
			catch(MenuChoiceException e)
			{
				System.out.println(e.getMessage());
			}
		}
	}
}
public class PhoneUnivInfo extends PhoneInfo {
	private String major;
	private int year;
	
	public PhoneUnivInfo(String name, String phoneNumber, String major, int year) {
		super(name, phoneNumber);
		this.major = major;
		this.year = year;
	}

	@Override
	public void printCurrentState() {
		super.printCurrentState();
		System.out.println("전공 : " + major);
		System.out.println("학년 : " + year);
	}
}

 

A. 내가 생각한 답 - hashSet

public interface Menu {
	int INSERT_PHONE_INFO = 1;
	int SEARCH_PHONE_INFO = 2;
	int DELETE_PHONE_INFO = 3;
	int SHOW_ALL_PHONE_INFO = 4 ;
	int QUIT_PROGRAM = 5 ;
	
	int GENERAL_INSERT_PHONE_INFO = 1;
	int UNIVERSITY_INSERT_PHONE_INFO = 2;
	int COMPANY_INSERT_PHONE_INFO = 3;	
}
public class MenuChoiceException extends Exception {
	public MenuChoiceException(int menu) {
		super(menu +"에 해당하는 메뉴가 없습니다."
                   +"메뉴 선택을 처음부터 다시 시작합니다.");
	}
}
import java.util.Scanner;

public class PhoneMain {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		PhoneInfoUI ui = new PhoneInfoUI();
		int menu =0;
		
		while(true) {
			ui.intro();
			try {
				menu = sc.nextInt();
				sc.nextLine();
				
				if(menu<Menu.INSERT_PHONE_INFO || menu > Menu.QUIT_PROGRAM) {
					throw new MenuChoiceException(menu);
				}
				
				switch(menu) {
				case Menu.INSERT_PHONE_INFO :
					ui.insert();
					break;
				case Menu.SEARCH_PHONE_INFO :
					ui.search();
					break;
				case Menu.DELETE_PHONE_INFO :
					ui.delete();
					break;
				case Menu.SHOW_ALL_PHONE_INFO :
					ui.showAllPhoneInfo();
					break;
				case Menu.QUIT_PROGRAM :
					ui.quitProgram();
					return;
				}
			} catch(MenuChoiceException e) {
			 System.out.println(e.getMessage());
			}
		}
	}
}
import java.util.Scanner;

public class PhoneInfoUI {
	
	Scanner sc = new Scanner(System.in);
	PhoneBook pb = new PhoneBook();
	int insertChoice=0;
	String name = null, phone = null;
	
	
	public void intro(){
		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 void insert(){
		System.out.println("데이터 입력을 시작합니다.");
		System.out.println("1. 일반 2. 대학 3. 회사");
		System.out.println("선택 >>");
		insertChoice = sc.nextInt();
		sc.nextLine();
		
		if(pb.insert(insertChoice)) {
			System.out.println("입력이 완료되었습니다.");
		} else {
			System.out.println("이미 입력된 데이터 입니다.");
		}
	}
	
	public void search() {
		System.out.println("데이터 검색을 시작합니다.");
		System.out.println("검색하실 이름을 입력하세요.");
		name = sc.nextLine();
		
		if(pb.search(name)) {
			System.out.println("검색이 완료되었습니다.");
		} else {
			System.out.println("검색 결과가 없습니다.");
		}
	}
	
	public void delete() {
		System.out.println("데이터 삭제를 시작합니다.");
		System.out.println("삭제하실 전화번호를 입력해주세요.");
		phone = sc.nextLine();
		
		if(pb.delete(phone)) {
			System.out.println("삭제가 완료되었습니다.");
		} else {
			System.out.println("삭제할 데이터가 존재하지 않습니다.");
		}
	}
	
	public void showAllPhoneInfo() {
		System.out.println("모든 데이터를 출력합니다.");
		pb.showAllPhoneInfo();
	}
	
	public void quitProgram() {
		System.out.println("프로그램을 종료합니다.");
	}
}
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;

public class PhoneBook {
	Scanner sc = new Scanner(System.in);	
	private HashSet<GeneralPhoneInfo> set = new HashSet<GeneralPhoneInfo>();
	private Iterator<GeneralPhoneInfo> itr;
	
	public boolean insert(int insertChoice) {
		
		GeneralPhoneInfo pi = null;
		String name = null, phone = null, major =null, company = null;
		int year = 0;
		
		switch(insertChoice) {
			case Menu.GENERAL_INSERT_PHONE_INFO :
				System.out.println("이름을 입력해주세요.");
				name = sc.nextLine();
				System.out.println("전화번호를 입력해주세요.");
				phone = sc.nextLine();
				pi = new GeneralPhoneInfo(name, phone);
				System.out.println("입력이 완료되었습니다.");
				break;
			case Menu.UNIVERSITY_INSERT_PHONE_INFO :
				System.out.println("이름을 입력해주세요.");
				name = sc.nextLine();
				System.out.println("전화번호를 입력해주세요.");
				phone = sc.nextLine();
				System.out.println("전공을 입력해주세요.");
				major = sc.nextLine();
				System.out.println("학년을 입력해주세요.");
				year = sc.nextInt();
				pi = new UnivPhoneInfo(name, phone, major, year);
				System.out.println("입력이 완료되었습니다.");
				break;
			case Menu.COMPANY_INSERT_PHONE_INFO:
				System.out.println("이름을 입력해주세요.");
				name = sc.nextLine();
				System.out.println("전화번호를 입력해주세요.");
				phone = sc.nextLine();
				System.out.println("회사를 입력해주세요.");
				company = sc.nextLine();
				pi = new CompanyPhoneInfo(name, phone, company);
				System.out.println("입력이 완료되었습니다.");	
				break;
		}
		return set.add(pi);
	}
	
	public boolean search(String name) {
		GeneralPhoneInfo pInfo = null;
		itr = set.iterator();
		boolean result = false;
 
		while(itr.hasNext()) {			
			pInfo = itr.next();
			if(pInfo.getName().equals(name)) {
				pInfo.showPhoneInfo();
				result = true;
			}
		}
		return result;
	}
	
	public boolean delete(String phone) {
		GeneralPhoneInfo pInfo = null;
		itr = set.iterator();
		boolean result = false;
 
		while(itr.hasNext()) {			
			pInfo = itr.next(); 
			if(pInfo.getPhone().equals(phone)) {
				itr.remove();
				result = true;
			}
		}
		return result;
	}
	
	public void showAllPhoneInfo() {
		itr = set.iterator();
		while(itr.hasNext()) {
			itr.next().showPhoneInfo();
		}
	}	
}
public class GeneralPhoneInfo{
	private String name;
	private String phone;
	
	public GeneralPhoneInfo(String name, String phone) {
		this.name = name;
		this.phone = phone;
	}
	
	public void showPhoneInfo() {
		System.out.println("이름 :"+name);
		System.out.println("전화번호 :"+phone);
	}

	public String getName() {
		return name;
	}

	public String getPhone() {
		return phone;
	}
	
	@Override
	public boolean equals(Object obj) {
		return phone.equals(((GeneralPhoneInfo)obj).phone);
	}
 
	@Override
	public int hashCode() {
		return phone.hashCode();
	}
}
class UnivPhoneInfo extends GeneralPhoneInfo{
	private String major;
	private int year;
	
	public UnivPhoneInfo(String name, String phone, String major, int year) {
		super(name, phone);
		this.major = major;
		this.year = year;
	}

	@Override
	public void showPhoneInfo() {
		super.showPhoneInfo();
		System.out.println("전공 :"+major);
		System.out.println("학년 :"+year);
	}	
}
public class CompanyPhoneInfo extends GeneralPhoneInfo{
	private String company;

	public CompanyPhoneInfo(String name, String phone, String company) {
		super(name, phone);
		this.company = company;
	}

	@Override
	public void showPhoneInfo() {
		super.showPhoneInfo();
		System.out.println("회사:"+company);
	}
}

 

A. 내가 생각한 답 - TreeSet

public interface Menu {
	int INSERT_PHONE_INFO = 1;
	int SEARCH_PHONE_INFO = 2;
	int DELETE_PHONE_INFO = 3;
	int SHOW_ALL_PHONE_INFO = 4 ;
	int QUIT_PROGRAM = 5 ;
	
	int GENERAL_INSERT_PHONE_INFO = 1;
	int UNIVERSITY_INSERT_PHONE_INFO = 2;
	int COMPANY_INSERT_PHONE_INFO = 3;	
}
public class MenuChoiceException extends Exception {
	public MenuChoiceException(int menu) {
		super(menu +"에 해당하는 메뉴가 없습니다."+"메뉴 선택을 처음부터 다시 시작합니다.");
	}
}
import java.util.Scanner;

public class PhoneMain {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		PhoneInfoUI ui = new PhoneInfoUI();
		int menu =0;
		
		while(true) {
			ui.intro();
			try {
				menu = sc.nextInt();
				sc.nextLine();
				
				if(menu<Menu.INSERT_PHONE_INFO || menu > Menu.QUIT_PROGRAM) {
					throw new MenuChoiceException(menu);
				}
				
				switch(menu) {
				case Menu.INSERT_PHONE_INFO :
					ui.insert();
					break;
				case Menu.SEARCH_PHONE_INFO :
					ui.search();
					break;
				case Menu.DELETE_PHONE_INFO :
					ui.delete();
					break;
				case Menu.SHOW_ALL_PHONE_INFO :
					ui.showAllPhoneInfo();
					break;
				case Menu.QUIT_PROGRAM :
					ui.quitProgram();
					return;
				}
			} catch(MenuChoiceException e) {
			 System.out.println(e.getMessage());
			}
		}
	}
}
import java.util.Scanner;

public class PhoneInfoUI {
	
	Scanner sc = new Scanner(System.in);
	PhoneBook pb = new PhoneBook();
	int insertChoice=0;
	String name = null, phone = null;
	
	
	public void intro(){
		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 void insert(){
		System.out.println("데이터 입력을 시작합니다.");
		System.out.println("1. 일반 2. 대학 3. 회사");
		System.out.println("선택 >>");
		insertChoice = sc.nextInt();
		sc.nextLine();
		
		if(pb.insert(insertChoice)) {
			System.out.println("입력이 완료되었습니다.");
		} else {
			System.out.println("이미 입력된 데이터 입니다.");
		}
	}
	
	public void search() {
		System.out.println("데이터 검색을 시작합니다.");
		System.out.println("검색하실 이름을 입력하세요.");
		name = sc.nextLine();
		
		if(pb.search(name)) {
			System.out.println("검색이 완료되었습니다.");
		} else {
			System.out.println("검색 결과가 없습니다.");
		}
	}
	
	public void delete() {
		System.out.println("데이터 삭제를 시작합니다.");
		System.out.println("삭제하실 전화번호를 입력해주세요.");
		phone = sc.nextLine();
		
		if(pb.delete(phone)) {
			System.out.println("삭제가 완료되었습니다.");
		} else {
			System.out.println("삭제할 데이터가 존재하지 않습니다.");
		}
	}
	
	public void showAllPhoneInfo() {
		System.out.println("모든 데이터를 출력합니다.");
		pb.showAllPhoneInfo();
	}
	
	public void quitProgram() {
		System.out.println("프로그램을 종료합니다.");
	}
}
import java.util.TreeSet;
import java.util.Iterator;
import java.util.Scanner;

public class PhoneBook {
	Scanner sc = new Scanner(System.in);	
	private TreeSet<GeneralPhoneInfo> set = new TreeSet<GeneralPhoneInfo>();
	private Iterator<GeneralPhoneInfo> itr;
	
	public boolean insert(int insertChoice) {
		
		GeneralPhoneInfo pi = null;
		String name = null, phone = null, major =null, company = null;
		int year = 0;
		
		switch(insertChoice) {
			case Menu.GENERAL_INSERT_PHONE_INFO :
				System.out.println("이름을 입력해주세요.");
				name = sc.nextLine();
				System.out.println("전화번호를 입력해주세요.");
				phone = sc.nextLine();
				pi = new GeneralPhoneInfo(name, phone);
				System.out.println("입력이 완료되었습니다.");
				break;
			case Menu.UNIVERSITY_INSERT_PHONE_INFO :
				System.out.println("이름을 입력해주세요.");
				name = sc.nextLine();
				System.out.println("전화번호를 입력해주세요.");
				phone = sc.nextLine();
				System.out.println("전공을 입력해주세요.");
				major = sc.nextLine();
				System.out.println("학년을 입력해주세요.");
				year = sc.nextInt();
				pi = new UnivPhoneInfo(name, phone, major, year);
				System.out.println("입력이 완료되었습니다.");
				break;
			case Menu.COMPANY_INSERT_PHONE_INFO:
				System.out.println("이름을 입력해주세요.");
				name = sc.nextLine();
				System.out.println("전화번호를 입력해주세요.");
				phone = sc.nextLine();
				System.out.println("회사를 입력해주세요.");
				company = sc.nextLine();
				pi = new CompanyPhoneInfo(name, phone, company);
				System.out.println("입력이 완료되었습니다.");	
				break;
		}
		return set.add(pi);
	}
	
	public boolean search(String name) {
		GeneralPhoneInfo pInfo = null;
		itr = set.iterator();
		boolean result = false;
 
		while(itr.hasNext()) {			
			pInfo = itr.next();
			if(pInfo.getName().equals(name)) {
				pInfo.showPhoneInfo();
				result = true;
			}
		}
		return result;
	}
	
	public boolean delete(String phone) {
		GeneralPhoneInfo pInfo = null;
		itr = set.iterator();
		boolean result = false;
 
		while(itr.hasNext()) {			
			pInfo = itr.next(); 
			if(pInfo.getPhone().equals(phone)) {
				itr.remove();
				result = true;
			}
		}
		return result;
	}
	
	public void showAllPhoneInfo() {
		itr = set.iterator();
		while(itr.hasNext()) {
			itr.next().showPhoneInfo();
		}
	}	
}
public class GeneralPhoneInfo implements Comparable<GeneralPhoneInfo>{
	private String name;
	private String phone;
	
	public GeneralPhoneInfo(String name, String phone) {
		this.name = name;
		this.phone = phone;
	}
	
	public void showPhoneInfo() {
		System.out.println("이름 :"+name);
		System.out.println("전화번호 :"+phone);
	}

	public String getName() {
		return name;
	}

	public String getPhone() {
		return phone;
	}
	
	@Override
	public boolean equals(Object obj) {
		return phone.equals(((GeneralPhoneInfo)obj).phone);
	}
 
	@Override
	public int hashCode() {
		return phone.hashCode();
	}
 
	@Override
	public int compareTo(GeneralPhoneInfo pInfo) {
		return name.compareTo(pInfo.name); 
	}
}
class UnivPhoneInfo extends GeneralPhoneInfo{
	private String major;
	private int year;
	
	public UnivPhoneInfo(String name, String phone, String major, int year) {
		super(name, phone);
		this.major = major;
		this.year = year;
	}

	@Override
	public void showPhoneInfo() {
		super.showPhoneInfo();
		System.out.println("전공 :"+major);
		System.out.println("학년 :"+year);
	}	
}
public class CompanyPhoneInfo extends GeneralPhoneInfo{
	private String company;

	public CompanyPhoneInfo(String name, String phone, String company) {
		super(name, phone);
		this.company = company;
	}

	@Override
	public void showPhoneInfo() {
		super.showPhoneInfo();
		System.out.println("회사:"+company);
	}
}
728x90