객체 배열에 대해 학습하고 응용문제로 전화번호부를 입력받아 저장, 검색, 출력하는 프로그램을 만들어 보았다.
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 를 생성했다.
'개발입문 > JAVA 세미프로젝트' 카테고리의 다른 글
[JAVA] 콘솔용 POS 프로그램 만들기 (0) | 2022.10.12 |
---|---|
[JAVA] Stream을 이용하여 파일 저장이 가능한 전화번호부 만들기 (0) | 2022.10.12 |
[JAVA] HashSet을 이용하여 중복값 저장이 안 되는 전화번호부 만들기 (0) | 2022.10.12 |
[JAVA] 상속과 오버라이딩을 이용하여 카테고리가 있는 전화번호부 만들기 (0) | 2022.10.12 |
댓글