본문 바로가기
JAVA/Collection

PhonBookTest(전화번호 관리 예제)

by 미눅스[멘토] 2023. 6. 23.
728x90
package kr.or.ddit.basic;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;


public class PhoneBookTest {
   private HashMap<String, Phone> phoneBookMap;
   private Scanner scan;
   
   // 생성자
   public PhoneBookTest() {
      scan = new Scanner(System.in); 
      phoneBookMap = new HashMap<>();
   }
    
   public static void main(String[] args) {
      new PhoneBookTest().phoneBookStart();
      
      
   }
   
   // 프로그램을 시작하는 메서드
   public void phoneBookStart() {
      System.out.println("+++++++++++++++++++++++++++++++++");
      System.out.println("  전 화 번 호 관 리 프 로 그 램  ");
      System.out.println("+++++++++++++++++++++++++++++++++");
      System.out.println();
      
      while(true) {
         int choice = displayMenu();
         
         switch(choice ) {
            case 1 : // 등록
               insert();
               break;
            case 2 : // 수정
               update();
               break;
            case 3 : // 삭제
               delete();
               break;
            case 4 : // 검색
               search();
               break;
            case 5 : // 전체출력
               displayAll(); 
               break;
            case 0 : // 종료
               System.out.println();
               System.out.println("프로그램을 종료합니다...");
               return;
            default : 
               System.out.println();
               System.out.println("작업 번호를 잘못 선택했습니다. 다시 선택하세요...");
         }
      }
   }
   
   // 전화번호 정보를 검색하는 메서드
   private void search() {
      System.out.println();
      System.out.println("검색할 전화번호 정보를 입력하세요...");
      System.out.print("이 름 >> ");
      String name = scan.next();
      
      if(!phoneBookMap.containsKey(name)) { // 해당 이름이 없으면...
         System.out.println();
         System.out.println(name + "씨 전화번호 정보가 없습니다...");
      }else {  // (return을 안하려면 else를 쓰면 됨.)
          Phone p = phoneBookMap.get(name);
          System.out.println(name + "씨 전화번호 정보");
          System.out.println("---------------------");
//          System.out.println("이 름 : " + name);
          System.out.println("이   름 : " + p.getName());
          System.out.println("전화번호: " + p.getTel());
          System.out.println("주   소 : " + p.getAddr());
          System.out.println("-------------------");
      }
      System.out.println();
   }
   
   // 전화번호 정보를 삭제하는 메서드
   private void delete() {
      System.out.println();
      System.out.println("삭제할 전화번호 정보를 입력하세요...");
      System.out.print("이 름 >> ");
      String name = scan.next();
      
      if(!phoneBookMap.containsKey(name)) { // 해당 이름이 없으면...
         System.out.println();
         System.out.println(name + "씨 전화번호 정보가 없습니다...");
         return;
      }
      
      phoneBookMap.remove(name);    // key값(이름)을 이용해서 삭제한다.
      
      System.out.println(name + "씨 전화번호 정보 삭제 완료!!!");
   }
   
   // 전화번호 정보를 수정하는 메서드
   private void update() {
      System.out.println();
      System.out.println("수정할 전화번호 정보를 입력하세요...");
      System.out.print("이 름 >> ");
      String name = scan.nextLine();
      
      if(!phoneBookMap.containsKey(name)) { // 해당 이름이 없으면...
         System.out.println();
         System.out.println(name + "씨 전화번호 정보가 없습니다...");
         return;
      }
      
      System.out.print("새로운 전화번호 >> ");
      String newTel = scan.next();
      
      scan.nextLine(); //입력 버퍼 비우기
      
      System.out.print("새로운 주소 >> ");
      String newAddr = scan.next();
      
      // 수정작업 ==> 값은 key값에 새로운 전화번호 정보를 저장한다.
      phoneBookMap.put(name, new Phone(name, newTel, newAddr));
      
      System.out.println(name + "씨의 전화번호 정보 변경완료!!!");
      
   }
   
   // 전체 전화번호 정보를 출력하는 메서드
   private void displayAll() {
      System.out.println();
      
      Set<String> phoneKeySet = phoneBookMap.keySet();
      
      System.out.println("-------------------------------------------------");
      System.out.println("번호    이 름     전화번호          주소");
      System.out.println("-------------------------------------------------");
      
      if(phoneKeySet.size() ==0) {
         System.out.println("    등록된 전화번호 정보가 하나도 없습니다...");
      }else {
         int num = 0;    // 번호 출력용 변수 선언
         // 향상된 for문도 사용가능 (아래는 이터레이터 사용)
         Iterator<String> keyIt = phoneKeySet.iterator();
         while(keyIt.hasNext()) {
            num++;
            String name = keyIt.next(); // 키값(이름) 가져오기
            Phone p = phoneBookMap.get(name);
            System.out.println(" " + num + "\t" + p.getName() + "\t" + p.getTel() + "\t" + p.getAddr());
         }
      }
      System.out.println("---------------------------------");
      System.out.println("출력 끝...");
   }
   
   
   /*
    	Scanner객체의  next(), nextInt(), nextDouble()....등 nextLineㅇ()이 아닌 메서드
    	==> 사이띄기, Tab키, Enter키를 구분 문자로 분리해서 분리된 자료만 읽어간다.
    	
    	Scanner객체의 nextLine()메서드
    	==> 한 줄 단위로 입력한다. 즉, 자료를 입력하고 Exter키를 누르면 Enter키까지 읽어가서
    		Enter키를 뺀 나머지 데이터를 반환한다.
    		
    	그래서 nextLine()메서드들을 사용하기 전에 nextLine()이외의 메서드로 입력한 이력이 있는 경우에는
    	nextLine()메서드를 한번 호출해서 안에남아있는 Enter키를 날려줘야한다.
    */
   
   // 새로운 전화번호 정보를 등록하는 메서드
   private void insert() {
      System.out.println();
      System.out.println("새롭게 등록할 전화번호 정보를 입력하세요.");
      System.out.print("이 름 >> ");
      String name = scan.next();
      
      // 이미 등록된 사람인지 여부 검사하기 // 이미 있으면...
      if(phoneBookMap.containsKey(name)) {
         System.out.println(name + "씨는 이미 등록된 사람입니다...");
         return;
      }
      
      System.out.print("전화번호 >> ");
      String tel = scan.next();
      
      scan.nextLine();
      
      System.out.print("주 소 >> ");
      String addr = scan.nextLine();
      
//      Phone p = new Phone(name, tel, addr);
//      phoneBookMap.put(name, p);
      
      phoneBookMap.put(name, new Phone(name, tel, addr));
      
      System.out.println(name + " 전화번호 정보 등록 완료!!!");
   }
   
   // 메뉴를 출력하고 작업번호를 입력받아 반환하는 메서드
   private int displayMenu() {
      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.println("0. 프로그램 종료   ");
      System.out.println("===================");
      System.out.print(" 번호 입력 >> ");
      return Integer.parseInt(scan.nextLine());
   }
}

// 이름, 주소, 전화번호를 멤버로 갖는 Phone클래스
class Phone{
   private String name;
   private String tel;
   private String addr;
   
   public Phone(String name, String tel, String addr) {
      super();
      this.name = name;
      this.tel = tel;
      this.addr = addr;
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getTel() {
      return tel;
   }

   public void setTel(String tel) {
      this.tel = tel;
   }

   public String getAddr() {
      return addr;
   }

   public void setAddr(String addr) {
      this.addr = addr;
   }

   @Override
   public String toString() {
      return "Phone [name=" + name + ", tel=" + tel + ", addr=" + addr + "]";
   }
   
}

'JAVA > Collection' 카테고리의 다른 글

StudentTest(학생 등수)  (0) 2023.06.23
PropertiesTest  (0) 2023.06.23
HotelTest(호텔예약)예제  (0) 2023.06.23
LottoStore(로또구입예제)  (0) 2023.06.22
VectorTest  (0) 2023.06.22