본문 바로가기
개발입문/JAVA 세미프로젝트

[JAVA] 배열을 이용한 전화번호부 만들기

by 양히◡̈ 2022. 10. 12.

객체 배열에 대해 학습하고 응용문제로 전화번호부를 입력받아 저장, 검색, 출력하는 프로그램을 만들어 보았다.

 

public class Menu {
	
	//static을 사용하면 객체 생성 없이 공유 가능해짐
	static void showMenu() {
		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("----------------");
	}
}

초기화면을 구성하는 클래스이다. 따로 만들 필요는 없지만 클래스 구분 연습을 위하여 따로 만들었다.

여기서는 showMenu 메소드를 static으로 만들어 메인 클래스에서 호출해서 사용하도록 했다.

 

public class PhoneInfo {
	
	private String name;
	private String phoneNumber;
	private String birth;

	//생성자 case1 성명, 폰번호, 생일
	public PhoneInfo(String name, String phoneNumber, String birth) {
		this.name = name;
		this.phoneNumber = phoneNumber;
		this.birth = birth;
	}
	
	//생성자 case2 성명, 폰번호
	public PhoneInfo(String name, String phoneNumber) {
		this.name = name;
		this.phoneNumber = phoneNumber;
	}

	public void showPhoneInfo() {
		System.out.println("name: " + getName());
		System.out.println("phone: " + phoneNumber);
		if (birth != null) {
			System.out.println("birth: " + birth);
		}
	}
	//검색,삭제할 때 name을 입력받아 찾기 위해서 게터를 만들어 줌
	public String getName() {
		return this.name;
	}
}

주소록을 저장하는 클래스로 여기서 이름, 핸드폰번호, 생일을 저장한다.

이름과 핸드폰번호만 입력받을 수도 있게 하기 위해 생성자를 두 케이스로 나누어 만들었다.

 

name은 이후 검색과 삭제 로직에서 필요하므로 게터를 추가 생성했다.

 

 

public class PhoneBookManager {
	final int max = 100; //100개까지 등록 가능
	PhoneInfo[] phoneList = new PhoneInfo[max];

	int cnt = 0; // 저장된 연락처의 개수

	//연락처 신규등록
	void readData() {
		System.out.println("이름: ");
		String name = PhoneBook.sc.nextLine();
		System.out.println("전화번호: ");
		String phoneNumber = PhoneBook.sc.nextLine();
		System.out.println("생년월일: ");
		String birthday = PhoneBook.sc.nextLine();

		// 연락처 객체 생성
		PhoneInfo pi = new PhoneInfo(name, phoneNumber, birthday);
		phoneList[cnt] = pi; // 연락처 객체의 배열에 값을 할당함
		cnt++;

		System.out.println("데이터 입력이 완료되었습니다.");
	}

	//연락처 검색
	void searchData() {
		System.out.println("데이터 검색을 시작합니다.\n검색할 이름: ");
		String name = PhoneBook.sc.nextLine();
		// searchIndex 메소드를 추가 생성하여 검색을 담당함
		int i = searchIndex(name); // searchIndex 메소드에서 이름으로 찾은 연락처의 위치
		
		if (i < 100) {
			phoneList[i].showPhoneInfo();
		} else {
			System.out.println("데이터를 찾을 수 없습니다.");
		}
	}

	//연락처 삭제
	void deleteData() {
		System.out.println("데이터 삭제를 시작합니다.\n삭제할 이름: ");
		String name = PhoneBook.sc.nextLine();
		int i = searchIndex(name);
		
		if (i<100) {
			arrSort(i);
			System.out.println("데이터가 삭제되었습니다.");
		} else {
			System.out.println("데이터를 찾을 수 없습니다.");
		}
		cnt--;
		
		System.out.println("현재 등록된 데이터의 개수는 "+cnt+"개 입니다.");
	}

	private void arrSort(int index) {
		for (int i = index; i < cnt; i++) {
			phoneList[i] = phoneList[i+1];
			//삭제할 값은 index인데 index를 삭제한 후 배열에서 삭제된 공간을 뒤에서 앞으로 당기며 메꾼다
			// 1,2,3,4,5
			// 1,2,3,null,5
			// phoneList[4]=phoneList[4+1];
			// 1,2,3,5
			phoneList[cnt] = null; //하나가 삭제되었으므로 맨 뒤의 값이 비게 됨
		}
	}

	int searchIndex(String name) { // return할 값이 int형이므로 int 자료형을 입력
		int index = 100; // 연락처가 0~99까지 저장되므로 연락처 범위 밖의 값을 지정
		// 검색을 실패할 경우 index의 기본값을 추출 = 데이터가 없습니다.
		for (int i = 0; i < cnt; i++) { // 저장된 연락처의 개수만큼 반복
			if (name.equals(phoneList[i].getName())) { // 연락처 배열의 이름을 탐색
				index = i; // 찾은 연락처가 몇 번째에 등록되어 있는지
			}
		}
		return index;
	}
}

데이터가 처리되는 클래스이다.

검색과 삭제는 동일하게 이름을 검색 받아 처리하므로, searchIndex 메소드 하나를 공유한다.

여기서 arrSort 메소드의 역할은 <삭제>를 한 후 배열 사이의 공백을 메꾸기 위함이며, 배열의 중간 부분이 삭제되었다면 그 뒷 부분을 앞으로 한 칸씩 땡겨와서 빈 공간을 맨 뒤로 밀어주는 작업이다.

 

import java.util.Scanner;

public class PhoneBook {
	
	//Scanner를 static으로 하면 다른 클래스에서도 호출 가능
	public static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {

		//PhoneBookManaher 클래스에서 만든 메소드를 사용하기 위해 생성자를 호출함
		PhoneBookManager manager = new PhoneBookManager();

		while (true) {
			Menu.showMenu();
			int input = sc.nextInt();
			sc.nextLine(); //이후 오류방지를 위해 삽입
			
			switch (input) {
			case 1:
				manager.readData();
				break;
			case 2:
				manager.searchData();
				break;
			case 3:
				manager.deleteData();
				break;
			case 4:
				System.out.println("프로그램이 종료됩니다.");
				System.exit(0);
				sc.close();
			}
		}
	}
}

여기가 메인 클래스이다.

초기 화면에서 선택창을 showMenu를 통해 호출하고,

각 선택 케이스마다 처리된 작업을 호출할 수 있도록 PhoneBookManager 를 생성했다.

댓글