문제) 이름, 주소, 전화번호를 멤버로 갖는 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;
}
}
'JAVA > HIGH JAVA' 카테고리의 다른 글
[JAVA] 네트워킹 - 소켓 프로그래밍 (0) | 2024.05.09 |
---|---|
[JAVA] 네트워킹 - InetAddress, URL, URLConnection (0) | 2024.05.08 |
[JAVA] 입출력 ( I/O ) - Buffered 스트림, Object 스트림, serialization (0) | 2024.05.07 |
5/3 Homework 사진 파일 복사 (0) | 2024.05.03 |
[JAVA] 입출력( I/O ) - File객체 (0) | 2024.05.02 |