package kr.or.ddit.basic;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
/*
문제) 이름, 주소, 전화번호를 멤버로 갖는 Phone클래스를 만들고,
Map을 이용하여 전화번호 정보를 관리하는 프로그램을 작성하시오.
이 프로그램에는 아래와 같은 메뉴가 있는데 이 기능을 모두 구현하시오.
메뉴예시)
1. 전화번호 등록
2. 전화번호 수정
3. 전화번호 삭제
4. 전화번호 검색
5. 전화번호 전체 출력
0. 프로그램 종료
(Map의 구조는 key값으로 저장되는 사람의 이름을 사용하고,
value값으로는 'Phone클래스의 인스턴스'로 한다.)
실행 예시)
----------------------
다음 메뉴를 선택하세요.
----------------------
1. 전화번호 등록
2. 전화번호 수정
3. 전화번호 삭제
4. 전화번호 검색
5. 전화번호 전체 출력
0. 프로그램 종료
----------------------
번호입력 >> 1
새롭게 등록할 전화번호 정보를 입력하세요.
이 름 >> 홍길동
전화번호 >> 010-1111-1111
주 소 >> 대전시 중구 대흥동
'홍길동'전화번호 등록 완료!!
----------------------
다음 메뉴를 선택하세요.
----------------------
1. 전화번호 등록
2. 전화번호 수정
3. 전화번호 삭제
4. 전화번호 검색
5. 전화번호 전체 출력
0. 프로그램 종료
----------------------
번호입력 >> 1
새롭게 등록할 전화번호 정보를 입력하세요.
이 름 >> 홍길동
'홍길동'은 이미 등록된 사람입니다.
다음 메뉴를 선택하세요.
----------------------
1. 전화번호 등록
2. 전화번호 수정
3. 전화번호 삭제
4. 전화번호 검색
5. 전화번호 전체 출력
0. 프로그램 종료
----------------------
번호입력 >> 5
----------------------------------------------------
번호 이 름 전화번호 주소
----------------------------------------------------
1 홍길동 010-1111-1111 대전시 중구 대흥동
~~~~
----------------------------------------------------
출력완료...
다음 메뉴를 선택하세요.
----------------------
1. 전화번호 등록
2. 전화번호 수정
3. 전화번호 삭제
4. 전화번호 검색
5. 전화번호 전체 출력
0. 프로그램 종료
----------------------
번호입력 >> 0
프로그램을 종료합니다.
*/
public class Semphone {
private HashMap<String, Phone> phoneBookMap;;//변수선언
private Scanner scan;;//변수선언
// 생성자
public Semphone() {
phoneBookMap = new HashMap<>();
scan = new Scanner(System.in);
}
public static void main(String[] args) {
new Semphone().phoneStart();
}
// 프로그램이 시작되는 메서드
public void phoneStart(){
System.out.println();
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("프로그램을 종료합니다.");
return;
default :
System.out.println("작업 번호를 잘못 입력했습니다.");
System.out.println("다시 선택하세요.");
}
}
}
//전화번호 정보 검색하는 메서드
private void search(){
System.out.println();
System.out.println("검색할 전화번호 정보 입력");
System.out.println("이름>>");
String name = scan.next();
if(!phoneBookMap.containsKey(name)){
//HashMap.containsKey(key) : key가 있으면 true, 없으면 false
//HashMap.containsValue(Value) : Value가 있으면 true, 없으면 false
System.out.println(name + "씨의 전화번호 정보가 없습니다.");
return;
}
Phone p = phoneBookMap.get(name);//왜만들었을까?
System.out.println(name + "씨의 전화번호 정보");
System.out.println("-------------------------");
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(name + "씨의 전화번호 정보가 없습니다.");
System.out.println("삭제 작업 실패!!");
return;
}
phoneBookMap.remove(name);
System.out.println(name + "씨 전번삭제");
}
// 전화번호 정보를 수정하는 메서드
private void update(){
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 newTel = scan.next();
System.out.print("새로운 주소 >> ");
String newAddr = scan.next();
// 정보 수정하기//뭐야이게..
// 방법1 ==> name을 이용해서 Phone객체를 구한후
// Phone객체의 내용을 변경한다.
// Phone p = phoneBookMap.get(name);
//이름을 맵에서 가져와서 p에 넣는다?
// p.setTel(newTel);//p에 tel을 넣기?
// p.setAddr(newAddr);
// 방법2 ==> 같은 key값에 새로운 전화번호 정보를 저장한다.
phoneBookMap.put(name, new Phone(name, newTel, newAddr));
}
// 새로운 전화번호 정보를 등록하는 메서드
// ==> 이미 등록된 사람은 등록되지 않는다.
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();
System.out.print("주 소 >> ");
// String addr = scan.next();
//이것만 쓰면 오류남. 왜? line은 한줄을 가져가지만 enter가 있으면 enter전까지만 출력함
scan.nextLine(); //입력 버퍼를 비워주는 역할을 한다.
String addr = scan.nextLine();//입력 받지 않은것 같지만 입력을 가져간것
/*
* Sacnner의 메서드 특징
* ==> nextLine()이 아닌 메서드를
* 즉, next() , nextInt(), nextDouble()...
* --> 사이 띄기 , Tab키, Enter키를 구분문자로 분리해서
* 분리된 자료만 읽어간다.(Enter키 값은 남아있음)
* ==> nextLine()
* --> 한 줄 단위로 입력한다.
* 즉, 자료를 입력하고 Enter키를 누르면 Enter키까지 읽어간다.
*
*
*/
// 등록방법1
// Phone p = new Phone(name, tel, addr);
// phoneBookMap.put(name, p);
// 등록방법2
phoneBookMap.put(name, new Phone(name, tel, addr));
System.out.println(name + "씨 전화번호 등록 완료!!");
}
// 전체 자료를 출력하는 메서드
private void displayAll(){
System.out.println();
System.out.println("-----------------------------------------");
System.out.println(" 번호 이 름 전화번호 주소");
System.out.println("-----------------------------------------");
Set<String> phoneKeySet = phoneBookMap.keySet();
//keySet(): 키값만 출력할 수 있음
//entrykey(): key, value값 둘다 출력할 수 있음
if(phoneKeySet.size()==0){
System.out.println(" 등록된 전화번호 정보가 하나도 없습니다.");
}else{
int count = 0; // 번호 출력에 사용할 변수 선언
Iterator<String> keyIt = phoneKeySet.iterator();
//Iterator는 인터페이스 ???
// set이 순서가 없어서 순차적으로 사용을 원해서 사용됨
while(keyIt.hasNext()){
count++;
String name = keyIt.next(); // 키값(이름) 구하기
Phone p = phoneBookMap.get(name); // value값(Phone객체) 구하기
System.out.println(" " + count + "\t" + p.getName() + "\t"
+ p.getTel() + "\t" + p.getAddr());
}
}
System.out.println("-----------------------------------------");
System.out.println(" 출력 끝...");
}
// 메뉴를 출력하고 작업할 번호를 입력받아 반환하는 메서드
private int displayMenu(){
System.out.println();
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("번호입력 >> ");
int num = scan.nextInt();
//정수형 데이터(숫자)만 입력받을수있음 / 출력 데이터가 문자열일때 에러가 뜸
return num;
}
}
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;
}
// getter, setter
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;
}
}