본문 바로가기
Java/기본 개념 및 클래스

[Java] 35. 배열 활용: 전화번호부 만들기

글: Song hyun 2024. 4. 22.
728x90
반응형

[Java] 35. 배열 활용: 전화번호부 만들기

 

전화번호부에 저장된 연락처 정보 CRUD 기능 구현

요구 사항

  • 저장: 사용자가 이름과 전화번호를 입력하여 전화번호부에 저장할 수 있어야 합니다.
  • 조회: 전체 연락처 목록을 조회하거나, 특정 이름으로 연락처를 검색하여 조회할 수 있어야 합니다.
  • 수정: 기존 연락처의 전화번호를 변경할 수 있어야 합니다.
  • 삭제: 전화번호부에서 연락처를 삭제할 수 있어야 합니다.
  • 선택 조회 : 이름을 입력하면 해당 전화번호가 출력 되어야 합니다.
  • 프로그램 종료 - 사용자가 프로그램 종료할 때 까지 계속 실행되어야 합니다.
  • Scanner 활용, 입력 받는 데이터 타입은 전부 String 으로 처리
  • 전화번호 저장은 100까지 한정.

나의 풀이 과정

 

1. PhoneBook 클래스 만들기

(1) String형 변수 name, number을 가지는 PhoneBook 클래스를 만든다.

(2) name, number를 필수로 가지게끔 사용자 정의 생성자를 만든다.

(3) setter/getter/showInfo 메서드를 생성한다.

 

2. PhoneNumberBookManage 파일 생성 및 실행 코드 작성

(1) 사용자에게 값을 입력받기 위해 Scanner 클래스를 import 한다.

(2) 사용자가 선택할 메뉴(1,2,3,4,5,0)을 상수로 선언, 초기화한다.

(3) PhoneBook 클래스의 newbook1 배열을 선언, 변수를 2개 정도 초기화한다.(테스트용)

(4) while 문의 조건식을 flag로 작성한다. 

-각각의 선택지를 while문-if문 형식으로 작성한다.

-필요한 메서드(함수)들은 main함수 바깥에 작성한다.(static 메서드)

 

2-1. 저장하기(SavePhoneBook)

*Static 변수인 LAST_INDEX_NUMBER를 사용하기 때문에, static 형식으로 작성하지 않으면 오류가 발생한다.

(https://whatsthatsound.tistory.com/64)

 

(1) Scanner 클래스를 통해 String형 변수 phoneName,phoneNumber에 입력받은 값을 초기화한다.

(2) new PhoneBook을 선언해, 사용자 지정 생성자에 phoneName, phoneNumber를 각각 초기화한다.

(3) 방어적 코드를 위해 main 함수 위에 LAST_INDEX_NUMBER라는 static int 변수를 선언한다. 이 때의 값은 0이다.

만약 phonebook[i]가 0이고, 해당 위치에 new PhoneBook이 초기화된다면 phonebook[i]는 더이상 null이 아니게 된다.

phonebook의 배열의 크기보다 더 많이 입력되지 않도록, 사용자가 정보를 저장할 때마다 LAST_INDEX_NUMBER에  1이 추가되도록 한다. LAST_INDEX_NUMBER는 배열이 감당할 수 있는 양만 저장하도록 하는 안전장치인 셈이다. 

(4) 저장이 완료된 뒤에는 break/return을 통해 반복문이 멈추게 한다.

 

2-2. 조회하기(SearchPhoneBook)

(1) for문을 통해, 배열의 길이(=인덱스)만큼 반복되도록 한다.

(2) for 문 내부에, phonebook[i]의 값이 null이 아니라면 모두 출력하게끔 if문을 선언한다.

이 때, phone[i].showInfo를 작성하면 간편하게 전체 조회를 할 수 있다.

(3) phone[i]!=null;인 값만 조회하면 되기에, 별도의 else if/else는 작성하지 않는다.

 

2-3. 수정하기(UpdatePhoneNumber)

(1) Scanner를 통해, 바꾸고자 하는 유저의 이름을 입력받는다.(userName)

(2) for문을 통해,

1. 첫번째로 null값이 아닌 변수들을 가려내고,

2. 그 중에서 phone[i].getName().equals(userName)인 값을 찾는다.

(3) 찾는 이름과 동일한 사람의 정보를 찾아냈다면, newName/newNumber 등의 변수에 수정할 정보를 입력받는다.

(4) 입력받은 변수를 phonebook[i].setName/Number를 통해 초기화한다.

(5) 만약 (1)에서 입력한 값과 동일한 사용자 정보가 없다면, 해당 스크립트를 출력한 뒤 break를 넣는다.

 

2-4. 삭제하기(DeleteNumber)

(1) deleteNumber에 Scanner 클래스를 통해 값을 입력받는다. 이 때, 입력받는 값은 사용자의 이름이다.

(2) for문을 통해 phonebook.length까지 반복하도록 한다. 이 때,

1. if문을 통해 null값이 아닌 변수 중에서

2. if문을 통해 phonebook[i].getName().equals(deletNumber)인 값을 찾는다.

(3) 만약 해당하는 사용자정보(배열)를 찾았을 경우, phonebook[i]=null;을 통해 초기화한다.

이 때, boolean 변수 flag3을 true로 초기화한다. (원래는 false)

(4) 만약 flag3=false(=해당하는 정보 없음)이라면, "잘못된 정보입니다. 다시 한 번 입력해주세요."를 출력하고 다시 돌아간다.

 

2-5. 선택조회하기(ChoiceAnd Search)

(1) Scanner 클래스로 사용자의 이름을 입력받는 String형 변수 searchName을 선언한다.

(2) for문을 통해 아래의 if문을 phonebook[i].length만큼 반복시킨다.

 (2-1). 만약 해당 변수가 null 값이 아니라면 (phonebook[i]!=null)

 (2-2). 그 중에서도 만약 searchName의 변수와 동일한 값을 가지고 있다면

 (2-3). showInfo를 통해 해당 변수의 값을 출력하게끔 한다. 동시에 boolean 변수 flag를 true로 초기화한다.

(3) 만약 flag의 값이 false라면, "찾으시는 사용자의 정보가 존재하지 않습니다."를 출력하고 break하게 한다.


 

(1) PhoneBook 클래스

package basic.exercise;

public class PhoneBook {

	// 속성 및 기능
	private String name;
	private String number;

	// 사용자 정의 생성자
	public PhoneBook(String name, String number) {
		this.name = name;
		this.number = number;
	}

	// getter 메서드
	public String getName() {
		return this.name;
	}

	public String getNumber() {
		return this.number;
	}

	// setter 메서드
	public void setName(String name) {
		this.name = name;
	}

	public void setNumber(String number) {
		this.number = number;
	}

	// 상태창 보여주기
	public void showInfo() {
		System.out.println("이름 : " + name);
		System.out.println("전화번호 : " + number);
	}

}

 

 

(2) PhoneBookManager 파일에서 실행하기

package basic.exercise;

import java.util.Scanner;

public class PhonBookManager {
	static int LAST_INDEX_NUMBER;

	public static void main(String[] args) {
		// 함수의 시작

		// 스캐너 사용
		// 배열 선언 100개
		// while

		// 1. 사용자에게 선택지를 보여준다.
		// 2. 스캐너로 사용자의 선택을 받는다.
		// 3. 사용자의 선택에 따라, 만약 --라면~
		Scanner sc = new Scanner(System.in);
		boolean flag = true;

		final String SAVE = "1";
		final String SEARCH_All = "2";
		final String UPDATE = "3";
		final String DELETE = "4";
		final String CHOICE_SEARCH = "5";
		final String END = "0";

		PhoneBook[] newbook1 = new PhoneBook[100];
		newbook1[1] = new PhoneBook("엄송현", "010-8885-4878");
		newbook1[2] = new PhoneBook("지나가는 사람", "010-xxxx-aaaa");

		while (flag) {
			System.out.println(">>>>>My Phone Book<<<<<");
			System.out.println("메뉴를 선택하시오.");
			System.out.println("1. 저장하기 | 2. 전체 조회하기 | 3. 수정하기 | 4. 삭제하기 | 5. 선택 조회하기 | 0. 종료하기");
			String choice = sc.nextLine();

			// 1. 저장하기
			if (choice.equals(SAVE)) {
				SavePhoneBook(sc, newbook1);
			}
			// 2. 조회하기
			else if (choice.equals(SEARCH_All)) {
				SearchPhoneBook_ByName(sc, newbook1);
			}
			// 3. 수정하기
			else if (choice.equals(UPDATE)) {
				UpdatePhoneNumber(sc, newbook1);
			}
			// 4. 삭제하기
			else if (choice.equals(DELETE)) {
				DeleteNumber(sc, newbook1);

			}
			// 5. 선택 조회하기
			else if (choice.equals(CHOICE_SEARCH)) {
				ChoiceAndSearch(sc, newbook1);

			}
			// 0. 종료하기
			else if (choice.equals(END)) {
				END();
				flag = false;

			}
			// 다른 값을 입력했을 때
			else {
				System.out.println("잘못된 값입니다. 다시 입력하세요.");
			}
		}

	} // end of main

	// 1. 저장하기
	public static void SavePhoneBook(Scanner sc, PhoneBook[] phonebook) {
		System.out.println("저장을 시작합니다.");
		System.out.println(" 사용자의 이름을 입력하시오. :");
		String phoneName = sc.nextLine();
		System.out.println(" 사용자의 전화번호를 입력하시오. :");
		String phoneNumber = sc.nextLine();
		PhoneBook phonebook1 = new PhoneBook(phoneName, phoneNumber);

		if (LAST_INDEX_NUMBER >= phonebook.length) {
			System.out.println("저장이 불가능합니다.");
			return;
		}

		for (int i = 0; i < phonebook.length; i++) {
			if (phonebook[i] == null) {
				phonebook[i] = phonebook1;
				LAST_INDEX_NUMBER++;
				break;
			}
		}
	}

	// 2. 조회하기
	public static void SearchPhoneBook_ByName(Scanner sc, PhoneBook[] phonebook) {
		System.out.println("전체 조회를 시작합니다.");
		System.out.println("-----------------------");
		for (int i = 0; i < phonebook.length; i++) {
			if (phonebook[i] != null) {
				phonebook[i].showInfo();
			}
		}
		System.out.println("-----------------------");

	}

	// 3. 수정하기
	public static void UpdatePhoneNumber(Scanner sc, PhoneBook[] phonebook) {
		System.out.println("기존 정보 수정을 시작합니다.");
		System.out.println("바꾸고자 하는 사용자의 이름을 입력하시오");
		System.out.println("-----------------------");
		String userName = sc.nextLine();
		boolean flag = true;

		for (int i = 0; i < phonebook.length; i++) {
			if (phonebook[i] != null) {
				if (phonebook[i].getName().equals(userName)) {
					System.out.println("수정할 이름을 입력하시오.");
					String newName = sc.nextLine();
					System.out.println("수정할 번호를 입력하시오.");
					String newNumber = sc.nextLine();
					phonebook[i].setName(newName);
					phonebook[i].setNumber(newNumber);
					System.out.println("정보가 성공적으로 수정되었습니다.");
					System.out.println("-----------------------");
					break;
				} else {
					System.out.println("-----------------------");
					System.out.println("수정하고자 하는 회원의 정보가 없습니다.");
					System.out.println("다시 한 번 입력해주세요.");
					System.out.println("-----------------------");
					break;
				}
			}
		}
	}

	// 4. 삭제하기
	public static void DeleteNumber(Scanner sc, PhoneBook[] phonebook) {
		System.out.println("기존 정보를 삭제합니다.");
		System.out.println("삭제하고자 하는 사용자의 이름을 입력하시오");
		String deleteNumber = sc.nextLine();
		for (int i = 0; i < phonebook.length; i++) {
			boolean flag3 = false;
			if (phonebook[i] != null) {
				if (phonebook[i].getName().equals(deleteNumber)) {
					phonebook[i] = null;
					System.out.println("정보가 성공적으로 삭제되었습니다.");
					flag3 = true;
				}
			}
			if (flag3 = false) {
				System.out.println("잘못된 정보입니다. 다시 한 번 입력해주세요.");
			}
		}
	}

	// 5. 선택 조회하기
	public static void ChoiceAndSearch(Scanner sc, PhoneBook[] phonebook) {
		System.out.println("기존 정보를 조회합니다.");
		System.out.println("조회하고자 하는 사용자의 이름을 입력하시오");
		String searchName = sc.nextLine();
		boolean flag = false;
		for (int i = 0; i < phonebook.length; i++) {
			if (phonebook[i] != null) {
				if (phonebook[i].getName().equals(searchName)) {
					phonebook[i].showInfo();
					flag = true;
					break;
				}
			} else if (flag == false) {
				System.out.println("찾으시는 사용자의 정보가 존재하지 않습니다.");
				break;
			}
		}
	}

	// 0. 종료하기
	public static void END() {
		System.out.println("프로그램을 종료합니다.");
		return;
	}

} // end of class
728x90
반응형