JAVA/HIGH JAVA

5/7 Homework - 전화번호 관리 + 데이터

아잠만_ 2024. 5. 8. 08:58

문제) 이름, 주소, 전화번호를 멤버로 갖는 Phone클래스를 만들고 Map을 이용하여 '전화번호 정보'를 관리하는 프로그램을 작성하시오.
(이 때 Map의 구조는 key값으로 '이름'데이터를 사용하고, value값으로는 'Phone클래스의 인스턴스'로 한다.)

 - 추가 조건 
   1) 6. 전화번호 저장 메뉴를 추가하고 구현한다 (저장 파일 명 : 'phoneData.dat) 
   2) 이 프로그램이 시작될 때 저장된 파일이 있으면 그 파일을 읽어와 Map에 세팅한다
   3) 프로그램을 종료할 때 Map의 데이터가 변경되거나 추가 또는 삭제되면 저장 후 종료되도록 한다.


package kr.or.ddit.basic;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class PhoneBookTest {
	// 띄어쓰기를 쓰면 scanner에서 오류 나중에 알려줌
	Scanner scan;
	private HashMap<String, Phone> phoneMap;
	// 데이터 변경 여부
	private boolean changeChk;

	// 생성자
	public PhoneBookTest() {
		phoneMap = new HashMap<String, Phone>();
		scan = new Scanner(System.in);
		changeChk = false;
	}

	public static void main(String[] args) {
		PhoneBookTest p = new PhoneBookTest();
		p.startProgram();
	}

	public void startProgram() {
		// 시작 시 데이터가 있다면 데이터를 phoneMap에 저장함
		getMap();

		while (true) {
			int choice = menu();
			System.out.println();
			switch (choice) {
			case 1:
				insert();
				break;
			case 2:
				update();
				break;
			case 3:
				delete();
				break;
			case 4:
				search();
				break;
			case 5:
				print();
				break;
			case 6:
				saveData();
				break;
			case 0:
				saveData();
				System.out.println("프로그램을 종료합니다...");
				return;
			default:
				System.out.println("잘못된 입력입니다.");
			}
		}
	}

	private int menu() {
		System.out.println();
		System.out.println("\t메  뉴");
		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("6. 전화번호 저장");
		System.out.println("0. 프로그램 종료");
		System.out.print("메뉴선택 : ");
		return scan.nextInt();
	}

	// 초기에 데이터가 있다면 phoneMap에 저장
	private void getMap() {
		File data = new File("d:/d_other/phoneData.dat");
		// 데이터가 없다면 종료
		if (!data.exists()) {
			return;
		}
		try {
			ObjectInputStream oin = new ObjectInputStream(new BufferedInputStream(new FileInputStream(data)));

			Object obj = null;

			while ((obj = oin.readObject()) != null) {
				Phone phone = (Phone) obj;
				phoneMap.put(phone.getName(), phone);
			}
			oin.close();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) { // readObject() 오류 검출
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	// 데이터  저장
	private void saveData() {
		// true값은 변경
		if(!changeChk) {
			System.out.println("변경할 것이 없습니다");
			return;
		}
		try {
			ObjectOutputStream oout = new ObjectOutputStream(
					new BufferedOutputStream(new FileOutputStream("d:/d_other/phoneData.dat")));

			for (String name : phoneMap.keySet()) {
				Phone phone = phoneMap.get(name);
				oout.writeObject(phone);
			}
			oout.writeObject(null);
			System.out.println("저장이 완료되었습니다");
			changeChk=false;
			oout.close();
		} catch (IOException e) {
			// TODO: handle exception
		}
	}

	private void insert() {
		System.out.println("새롭게 등록할 전화번호 정보를 입력하세요.");
		System.out.print("이름 >> ");
		String name = scan.next();
		if (phoneMap.containsKey(name)) {
			System.out.println("'" + name + "'은 이미 등록된 사람입니다.");
			return;
		}
		System.out.print("전화번호 >> ");
		String telNo = scan.next();
		scan.nextLine(); // 입력 버퍼 엔터 비움
		System.out.print("주소 >> ");
		String address = scan.nextLine();
		Phone p = new Phone();
		p.setName(name);
		p.setTelNo(telNo);
		p.setAddress(address);
		phoneMap.put(name, p);
		System.out.println("'" + name + "' 전화번호 등록 완료!!");
		changeChk = true;
	}

	private void update() {
		System.out.println("변경할 이름을 입력해주세요");
		String name = scan.next();
		if (!phoneMap.containsKey(name)) {
			System.out.println("'" + name + "'은 등록되지 않은 사람입니다.");
			return;
		}
		System.out.print("전화번호 >> ");
		String telNo = scan.next();
		scan.nextLine(); // 입력 버퍼 엔터 비움
		System.out.print("주소 >> ");
		String address = scan.nextLine();
		Phone p = new Phone();
		p.setName(name);
		p.setTelNo(telNo);
		p.setAddress(address);
		phoneMap.put(name, p);
		System.out.println("'" + name + "' 전화번호 변경 완료!!");
		changeChk = true;
	}

	private void delete() {
		System.out.println("삭제할 이름을 입력해주세요");
		String name = scan.next();
		if (!phoneMap.containsKey(name)) {
			System.out.println("'" + name + "'은 등록되지 않은 사람입니다.");
			return;
		}
		phoneMap.remove(name);
		System.out.println("'" + name + "' 삭제 완료!!");
		changeChk = true;
	}

	private void search() {
		System.out.println("검색할 이름을 입력해주세요");
		String name = scan.next();
		if (!phoneMap.containsKey(name)) {
			System.out.println("조회 결과가 없습니다.");
			return;
		}
		System.out.println("----------------------------------------");
		System.out.println("이름\t전화번호\t\t주소");
		System.out.println("----------------------------------------");
		System.out.println(name + "\t" + phoneMap.get(name).getTelNo() + "\t" + phoneMap.get(name).getAddress());
		System.out.println("----------------------------------------");
	}

	private void print() {
		System.out.println();
		System.out.println("----------------------------------------");
		System.out.println("번호\t이름\t전화번호\t\t주소");
		System.out.println("----------------------------------------");
		int count = 0;
		if (phoneMap.size() == 0) {
			System.out.println("등록된 전화번호 정보가 하나도 없습니다...");
		} else {
//			for(String name : phoneMap.keySet()) {
//				Phone phone = phoneMap.get(name);
//				String telNo = phone.getTelNo();
//				String address = phone.getAddress();
//				System.out.println(++count + "\t" + name + "\t" + telNo + "\t" + address);
//			}

			for (Map.Entry<String, Phone> entry : phoneMap.entrySet()) {
				String name = entry.getKey();
				Phone phone = entry.getValue();
				String telNo = phone.getTelNo();
				String address = phone.getAddress();
				System.out.println(++count + "\t" + name + "\t" + telNo + "\t" + address);
			}
		}
		System.out.println("----------------------------------------");
		System.out.println("출력 끝...");
		System.out.println();
	}

}

class Phone implements Serializable {
	private String name;
	private String address;
	private String telNo;

	public String getName() {
		return name;
	}

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

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getTelNo() {
		return telNo;
	}

	public void setTelNo(String telNo) {
		this.telNo = telNo;
	}

}