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

SW/Java

2020. 6. 24. 17:18

# 현재까지 배운 내용을 총정리한 문제이므로 정확하게 숙지하는 것이 좋다.

 

Q. 전화번호 관리 프로그램 03단계 문제 (Day10과 동일문제)

 

배열을 이용해서, 프로그램 사용자가 입력하는 정보가 최대 100개까지 유지되도록 프로그램을 변경하자.

그리고 다음의 기능을 추가로 삽입하자.

 

@ 저장 이름, 전화번호, 생년월일 정보를 대상으로 저장의 과정을 진행한다.

@ 검색 이름을 기준으로 데이터를 찾아서 해당 데이터의 정보를 출력해준다.

@ 삭제 이름을 기준으로 데이터를 찾아서 삭제의 과정을 진행한다.

 

우리가 저장하는 데이터 중에는 동명이인의 데이터가 존재하지 않는다고 가정하겠다.

(답변에서 동명이인 있다고 가정했음)

그리고 데이터의 삭제는 다음의 형태로 이뤄져야 한다.

 

"배열의 중간에 저장된 데이터를 삭제할 경우에는,

해당 요소의 뒤에 저장된 요소들을 한 칸씩 앞으로 이동시키는 형태로 삭제를 진행한다."

 

다음의 기능을 담당하는 Manager 클래스를(또는 Control 클래스라 불리는) 정의해서 프로그램을 완성하자.

 

@ 데이터의 저장

@ 데이터의 검색

@ 데이터의 삭제

 

전화번호 관리 프로그램 03단계 프로그램의 실행 예시

 

선택하세요...

1. 데이터 입력

2. 데이터 검색

3. 데이터 삭제

4. 모든 데이터 보기

5. 프로그램 종료

선택 : 1

데이터 입력을 시작합니다.

이름 : 홍길동

전화번호 : 222 - 3333

생년월일 : 99 1225일생

데이터 입력이 완료되었습니다.

 

선택하세요...

1. 데이터 입력

2. 데이터 검색

3. 데이터 삭제

4. 모든 데이터 보기

5. 프로그램 종료

선택 : 2

데이터 검색을 시작합니다.

이름 : 홍길동

 

이름 : 홍길동

전화번호 : 222 - 3333

생년월일 : 99 1225일생

데이터 검색이 완료되었습니다. // 없으면 데이터가 없습니다 출력할 것

 

선택하세요...

1. 데이터 입력

2. 데이터 검색

3. 데이터 삭제

4. 모든 데이터 보기

5. 프로그램 종료

선택 : 3

데이터 삭제를 시작합니다.

이름 : 홍길동

데이터 삭제가 완료되었습니다.

 

A. 강사님의 답

- 각 클래스 관리 방법

  메인 클래스에 전부 넣게 되면 가독성이 떨어지고,

  부분적인 수정을 할 때도 시간이 오래걸리는 문제점이 발생하기 때문에 따로 클래스를 나누어 관리해주는 것이다.

import java.util.Scanner;

public class PhoneMain {

	private static final int INSERT_PHONE_INFO=1; 		
    						// 상수로 준 이유 : 가독성을 높이기 위해서
	private static final int SEARCH_PHONE_INFO=2;
	private static final int DELETE_PHONE_INFO=3;
	private static final int SHOW_ALL_PHONE_INFO=4;
	private static final int QUIT_PHONE_INFO=5;
	
	public static void main(String[] args) {
		
		int menu=0;		
		PhoneBookUI pbUI = new PhoneBookUI();
		Scanner sc = PhoneBookUI.sc;
		
		while(true)
		{
			pbUI.printMenu(); 
			menu = sc.nextInt();
			sc.nextLine();
			switch(menu)
			{
			case INSERT_PHONE_INFO: //case 숫자 대신 상수로 만들어 써주어 가독성이 올림
				pbUI.inputPhoneInfo(); 
				break;
			case SEARCH_PHONE_INFO:
				pbUI.searchPhoneInfoByName();
				break;
			case DELETE_PHONE_INFO:
				pbUI.deletePhoneInfoByPhoneNumber();
				break;
			case SHOW_ALL_PHONE_INFO:
				pbUI.printAllPhoneInfo();
				break;
			case QUIT_PHONE_INFO:
				pbUI.quitProgram();
				return;				
			}
		}
	}
}
import java.util.Scanner;

public class PhoneBookUI {
	private PhoneBook pb;
	public static Scanner sc = new Scanner(System.in);
	
	public PhoneBookUI()
	{
		this.pb = PhoneBook.getPhoneBook(100); //클래스이름.클래스메소드()	
	}
	
	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 inputPhoneInfo()
	{
		String name, phoneNumber, birthday;
		boolean result;
		
		System.out.println("데이터 입력을 시작합니다.");
		System.out.println("이름 : ");
		name = sc.nextLine();
		System.out.println("전화번호 : ");
		phoneNumber = sc.nextLine();
		System.out.println("생년월일 : ");
		birthday = sc.nextLine();		
		result = pb.insertPhoneInfo(name, phoneNumber, birthday);
		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 PhoneBook {
	
	private static PhoneBook pb;
	private PhoneInfo[] pInfoArr;
	private int numOfPhoneInfo;
	
	private PhoneBook(int size) 
	{
		pInfoArr = new PhoneInfo[size];
	}
	
	public static PhoneBook getPhoneBook(int size)
	{
		if(pb==null)
			pb = new PhoneBook(size);
		return pb;
	}
	
	public boolean insertPhoneInfo(String name, String phoneNumber, String birthday)
	{
		if(numOfPhoneInfo >= pInfoArr.length)
			return false; //번호가 100개가 넘었을 때 false로 넘어감
		pInfoArr[numOfPhoneInfo++] = new PhoneInfo(name, phoneNumber, birthday);
		return true;
	}
	
	public boolean searchPhoneInfoByName(String name)
	{
		boolean result = false;
		for(int i=0;i<numOfPhoneInfo;i++)
		{
			if( name.compareTo(pInfoArr[i].getName()) == 0 )
			{
				pInfoArr[i].printCurrentState();
				result = true;
			}
		}
		return result;
	}
	
	public int searchPhoneInfoByPhoneNumber(String phoneNumber)
	{
		for(int i=0;i<numOfPhoneInfo;i++)
		{
			if( phoneNumber.compareTo(pInfoArr[i].getPhoneNumber()) == 0 )
			{
				return i;
			}
		}
		
		return -1;
	}
	
	public boolean deletePhoneInfoByPhoneNumber(String phoneNumber)
	{
		boolean deleteResult = false;
		int searchResult = searchPhoneInfoByPhoneNumber(phoneNumber);
		if( searchResult != -1 )
		{
			for(int i=searchResult;i<numOfPhoneInfo-1;i++)
				pInfoArr[i] = pInfoArr[i+1];
			
			pInfoArr[numOfPhoneInfo-1] = null;
			deleteResult = true; //삭제되어서 true
			numOfPhoneInfo--; 
		}
		
		return deleteResult;
	}
	
	public void printAllPhoneInfo()
	{
		for(int i=0;i<numOfPhoneInfo;i++)
			pInfoArr[i].printCurrentState();
		System.out.println();
	}
}
public class PhoneInfo {  //실질적인 배열관리..
	private String name;
	private String phoneNumber;
	private String birthday;
	
	public PhoneInfo(String name, String phoneNumber, String birthday) {
		this.name = name;
		this.phoneNumber = phoneNumber;
		this.birthday = birthday;
	}
	
	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);
		System.out.println("생일 : "  + birthday);
	}
}

 

A. 내가 만들어본 방식

import java.util.*;
public class PhoneMain 
{
	public static void main(String[] args) 
	{
		PhoneBook pb = new PhoneBook();
		int menu=0;
		
		while(true)
		{
			pb.intro();
			menu = pb.sc.nextInt();
			pb.sc.nextLine();
			
			switch(menu)
			{
			case 1 :
				pb.input();
				break;
			case 2 :
				pb.search();
				break;
			case 3 :
				pb.delete();
				break;
			case 4 :
				pb.allData();
				break;
			case 5 :
				System.out.println("프로그램을 종료합니다.");
				return;
			default :
				System.out.println("잘못 입력 하셨습니다.");
				return;
			}
		}
	}
}
import java.util.Scanner;

public class PhoneBook 
{
	Scanner sc = new Scanner(System.in);
	PhoneInfo instance;
	String name, phone, birth = null;
	int size=100;
    PhoneInfo[] array = new PhoneInfo[size];
	int cnt=0;
	boolean flag = true;
	
	
	public void intro()
	{
		System.out.println();
		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 input()
	{
		System.out.println("데이터 입력을 시작합니다.");
		System.out.println("이름 : ");
		name = sc.nextLine();
		System.out.println("전화번호 : ");
		phone = sc.nextLine();
		System.out.println("생년월일 : ");
		birth = sc.nextLine();
		System.out.println("데이터 입력이 완료되었습니다.");
		instance = new PhoneInfo(name, phone, birth);
		array[cnt++] = instance;
	}
	
	public void search()
	{
		System.out.println("데이터 검색을 시작합니다.");
		System.out.print("전화번호 : ");
		phone = sc.nextLine();
		for(int i=0;i<cnt;i++)
		{
			if(array[i].getPhone().equals(phone))
			{
				array[i].printCurrentState();
				System.out.print("데이터 검색이 완료되었습니다.");
				break;
			}
			else
				System.out.print("데이터가 존재하지 않습니다.");
				break;	 
		}
		System.out.println();
	}
	
	public void delete()
	{
		System.out.println("데이터 삭제를 시작합니다.");
		System.out.print("전화번호 : ");
		phone = sc.nextLine();
		for(int i=0;i<cnt;i++)
		{
			if((array[i].getPhone()).equals(phone))
			{
				for(int j=i; j<cnt-1;j++)
				{
					array[j]=array[j+1];
				}
				array[cnt-1] = null;
				cnt--;
				flag=false;
				System.out.println("데이터 삭제가 완료되었습니다."); 
				break;
			}
		}
		if(flag) System.out.println("삭제할 데이터가 존재하지 않습니다."); 
	}
	
	public void allData()
	{
		for(int i=0;i<cnt;i++)
			array[i].printCurrentState();
		System.out.println();
	}
}
class PhoneInfo 
{
	private String name;
	private String phone;
	private String birth;
	
	public PhoneInfo(String name, String phone, String birth)
	{
		this.name = name;
		this.phone = phone;
		this.birth = birth;
	}
	
	public void printCurrentState()
	{
		System.out.println("이름 : "+name);
		System.out.println("전화번호 : "+phone);
		System.out.println("생년월일 : "+birth);
	}

	public String getName() 
	{
		return name;
	}

	public String getPhone() 
	{
		return phone;
	}
}

 

- 강사님의 답 : 기능을 ui와 자세한 기능으로 나눔

- 나의 방법 : 메인클래스와 기능만 나눔

728x90