JAVA/HIGH JAVA

4/24 Homework - 전화번호 관리/ Scanner next(),nextLine()

아잠만_ 2024. 4. 24. 18:16
문제) 이름, 주소, 전화번호를 멤버로 갖는 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번만 실행해주면된다!