문제) 이름, 주소, 전화번호를 멤버로 갖는 Phone클래스를 만들고
Map을 이용하여 '전화번호 정보'를 관리하는 프로그램을 작성하시오.
(이 때 Map의 구조는 key값으로 '이름'데이터를 사용하고, value값으로는 'Phone클래스의 인스턴스'로 한다.)
HashMap<String, Phone> 변수명 = new HashMap<String, Phone>( );
아래의 메뉴를 처리하는 프로그램을 완성하시오
실행예시)
메 뉴
1. 전화번호 등록
2. 전화번호 수정
3. 전화번호 삭제
4. 전화번호 검색
5. 전화번호 전체 출력
0. 프로그램 종료
------------------
번호 입력 >> 1
새롭게 등록할 전화번호 정보를 입력하세요.
이름 >> 홍길동 //key값이 홍길동
전화번호 >> 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
프로그램을 종료합니다...
package kr.or.ddit.basic;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
* 문제) 이름, 주소, 전화번호를 멤버로 갖는 Phone클래스를 만들고 Map을 이용하여 '전화번호 정보'를 관리하는 프로그램을 작성하시오.
* (이 때 Map의 구조는 key값으로 '이름'데이터를 사용하고, value값으로는 'Phone클래스의 인스턴스'로 한다.)
*/
public class PhoneBookTest {
// 띄어쓰기를 쓰면 scanner에서 오류 나중에 알려줌
Scanner scan;
private HashMap<String, Phone> phoneMap;
// 생성자
public PhoneBookTest() {
phoneMap = new HashMap<String, Phone>();
scan = new Scanner(System.in);
}
public static void main(String[] args) {
PhoneBookTest p = new PhoneBookTest();
p.startProgram();
}
public void startProgram() {
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 0:
System.out.println("프로그램을 종료합니다...");
break;
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("0. 프로그램 종료");
System.out.print("메뉴선택 : ");
return scan.nextInt();
}
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 + "' 전화번호 등록 완료!!");
}
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 + "' 전화번호 변경 완료!!");
}
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 + "' 삭제 완료!!");
}
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 {
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;
}
}
Scanner
next() (> 문자열을 입력받음) 를 입력했을 때,
Cpu는 버퍼에 정보가 있나 없나 확인한후 없으면 버퍼는 입력장치에서 정보를 입력받은것을 버퍼에서 가져와 Cpu로 가져온다
nextLine()을 제외하고 next(), nextInt() 등등 은
데이터를 가져올 때 엔터키, 탭 키, 띄어쓰기를 기준으로 데이터를 분리
그래서 만약에 next()에 '123 456'을 입력했을 때
cpu는 처음에 123만을 가져가고
버퍼에는 456이 남게되어
다음 입력시에는 자동으로 456이 입력이 됨
next() 전화번호\r > 버퍼에는 \r 만남음
nextLine() 버퍼에 있는 \r을 가져가서 바로 입력됨
next와 nextLine을 같이쓰면 발생할 수있는 현상
nextLine쓰기 이전에 next(), nextInt() 등을 사용하였다면 버퍼의 값을 지워줘야함 그 사이에 nextLine을 한번더 써주면됨
System.out.print("전화번호 >> ");
String telNo = scan.next();
scan.nextLine(); // 입력 버퍼 엔터 비움
System.out.print("주소 >> ");
String address = scan.nextLine();
정리
- Scanner 객체에 대하여..
1) next(), nextInt(), nextDouble() ...
==> 사이띄기(공백), Tap키, 엔터키를 구분 문자로 분리해서 분리된 자료만 가져간다.
2) nextLine()
==> 한 줄 단위로 입력한다.
즉, 한 줄 전체(Enter키 포함)를 읽어가서 Enter키를 뺀 나머지 데이터를 반환한다.
그래서 nextLine()를 사용하기 전에 'nextLine()'이 아닌 입력 명령을 사용한 적이 있으면
'입력버퍼'를 nextLine()을 통해 비워줘야 한다.
새로운 next(), nextInt(), nextDouble()가 또 시행될 때는 기존 버퍼에 있던 엔터키가 삭제되므로
이후 nextLine()을 사용하기 위해 입력버퍼를 지워주기 위해 nextLine()은 전에 사용했던
단 하나의 next()에 관해서만 삭제해주면 되기 때문에 nextLine()을 1번만 실행해주면된다!
'JAVA > HIGH JAVA' 카테고리의 다른 글
4/25 Homework - 호텔관리 (0) | 2024.04.25 |
---|---|
[JAVA] Properties (0) | 2024.04.25 |
[JAVA] Map (0) | 2024.04.24 |
[JAVA] Equals HashCode (0) | 2024.04.24 |
4/23 Homework - 야구게임, 로또생성기 (0) | 2024.04.24 |