일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 백준
- 이클립스
- 인터페이스
- 자바
- 설정
- 무결성 제약조건
- 백준문제
- 티스토리 블로그
- 스프링
- Oracle
- 오라클
- 별 찍기
- for문
- jsp
- MSI
- spring
- Ajax
- 순환문
- 전화번호부
- while
- 백준문제풀이
- 환경설정
- 오류모음
- 공부
- 깃허브 블로그
- 오류
- 이클립스단축기
- ORA-01407
- 파워서플라이
- ORA-02292
- Today
- Total
danDevlog
Java - day8(전화번호부 3단계) 본문
PhoneBook클래스
package Test1;
public class PhoneBook {
public static void main(String[] args) {
PhoneBookManager manager = new PhoneBookManager();//객체 1개를 공유 해야 함.
while (true) {
Menu.showMenu(manager);
}
}
}
여기서 PhoneBookManager 객체 선언을 while문 안에다 만들어서 2시간 동안 개고생함
showMenu를 호출할 때 매개변수를 주면서 manager라는 객체 1개만 가지고 작동하는 방식으로 해야 함.
Menu클래스에서 새 객체를 만들면 안 됨.
PhoneInfo클래스
package Test1;
class PhoneInfo //데이터 클래스
{
private String name;
private String phoneNumber;
private String birth;
//생성자
public PhoneInfo(String name, String phoneNumber, String birth) {
// TODO Auto-generated constructor stub
this.name = name;
this.phoneNumber = phoneNumber;
this.birth = birth;
}
public PhoneInfo() {
}
public void showPhoneInfo(){
System.out.println("name: "+ name);
System.out.println("phone: "+ phoneNumber);
if(birth!=null)
System.out.println("birth: "+ birth);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
} //PhoneInfo end
매개변수가 3개인 생성자를 만들고, Default 생성자도 만듦
showPhoneInfo 메서드를 통해 정보를 출력함
데이터 검색과 삭제할 때 사용하기 위하여 name변수의 getter와 setter를 만듦
Menu클래스
package Test1;
import java.util.Scanner;
class Menu
{
static void showMenu(PhoneBookManager pb)
{
// PhoneBookManager pb = new PhoneBookManager(); // 만악의 원흉
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("---------------");
// pb.resetPhoneInfo();
Scanner sc = new Scanner(System.in);
System.out.print("선택 : ");
int input = sc.nextInt();
switch (input) {
case 1:
sc.nextLine();
System.out.print("이름 : ");
String name = sc.nextLine();
System.out.print("전화번호 : ");
String number = sc.nextLine();
System.out.print("생년월일 : ");
String birth = sc.nextLine();
pb.readData(name, number, birth);
// 더미 데이터 만들기.
// pb.readData("hong0", "1111", "990201");
// pb.readData("hong1", "1111", "990202");
// pb.readData("hong2", "1111", "990203");
// pb.readData("hong3", "1111", "990204");
// pb.readData("hong4", "1111", "990205");
break;
case 2:
System.out.println("데이터 검색을 시작합니다.");
pb.searchData();
break;
case 3:
System.out.println("데이터 삭제 시작합니다.");
pb.deleteData();
break;
case 4:
System.out.println("프로그램을 종료합니다.");
sc.close();
System.exit(0);
break;
case 5:
System.out.println("전화번호부를 출력합니다.");
pb.watchBook();
break;
default:
System.out.println("잘못선택하셨습니다.");
break;
}
}
}
PhoneBookManager pb = new PhoneBookManager(); 이 부분을 Menu클래스에서 선언했기 때문에
main메서드에서 while로 반복되면서 새로운 객체가 메모리에 계속 생긴다.
즉, 전화번호부 1권, 2권, 3권처럼 새로운 객체가 생겨나기 때문에 아무리 1권에 데이터를 등록해도
반복이 끝나고 다시 시작되면서 새 객체(2권)에 또 새 데이터를 등록한다.
PhoneBookManager클래스
package Test1;
import java.util.Scanner;
class PhoneBookManager // 제어 클래스
{
Scanner sc = new Scanner(System.in);
final int MAX = 100;
//public PhoneInfo[] phoneList = new PhoneInfo[MAX];
PhoneInfo[] phoneList = new PhoneInfo[MAX];// 객체 배열에 값이 초기화 됨.
int cnt=0;
// 등록시 객체 배열과 검색시 객체 배열이 다른 상황.
// pb.readData("hong0", "1111", "990201");
// void readData();
void readData(String name, String phoneNumber, String birth) {
phoneList[cnt] = new PhoneInfo(name, phoneNumber, birth);
cnt++;
System.out.println("입력이 완료되었습니다.");
// for(int i=0;i<cnt;i++) {
// System.out.println(phoneList[i].getName());
// }
}
void searchData() {
// for(int i=0;i<5;i++) {
// System.out.println(phoneList[i].getName());
// }
System.out.print("검색할 이름 : ");
String name2 = sc.nextLine();
boolean isTrue = false;
// System.out.println("cnt:"+this.cnt);//0
// System.out.println(phoneList[0].getName());
for (int i = 0; i < cnt; i++) {
// System.out.println(phoneList[i].getName());
if (name2.equals(phoneList[i].getName())) {
phoneList[i].showPhoneInfo();
isTrue = true;
}
}
System.out.println(isTrue == true ? "" : "데이터가 없습니다.\n");
}
void deleteData() {
System.out.print("검색할 이름 : ");
String name3 = sc.nextLine();
boolean isTrue = true;
for (int i = 0; i < cnt; i++) {
if (name3.equals(phoneList[i].getName())) {
for(int j = 0; j<cnt-1; j++) {
phoneList[j] = phoneList[j+1];
}
cnt--;
System.out.println("데이터 삭제 완료");
}else {
isTrue = false;
}
}
System.out.println(isTrue == true ? "" : "데이터가 없습니다.\n");
}
void watchBook() {
for (int i = 0; i < cnt; i++) {
phoneList[i].showPhoneInfo();
}
}
}// end class
데이터 등록 메서드는 cnt를 1씩 증가시키면서 배열의 0, 1, 2,..... 번째에 phoneInfo 인스턴스를 생성한다.
데이터 검색에서 for문에 phoneList.length를 사용해서 처음에 헤매었다.
위에 MAX값을 100으로 주었기 때문에 for문도 100까지 도는데 데이터 생성은 그 아래 숫자만큼만 했기 때문에
Null인 상태인데 getName을 하니 당연히 오류가 발생한 것이다.
배열. length는 처음에 배열을 초기화할 때나 사용하자.
데이터 삭제는 단순이 해당 인덱스를 Null로만 만든다고 해결되지 않는다.
O O O O 처럼 배열이 채워져 있다면,
O O X O 왼쪽처럼 삭제를 하고 단순히 cnt만 감소시킨다면,
O O X 가 되어서 애꿎은 4번째는 for문에 걸리지도 않는다.
때문에 해당 인덱스 번호부터 인데스 번호 + 1 번째의 정보를 삭제할 위치의 인덱스 번호에 가져온다.
즉, 한 칸씩 당겨와야 제대로 삭제가 된다.
'Java' 카테고리의 다른 글
Java - day10(배열, 상속, 전화번호 4단계) (0) | 2022.02.28 |
---|---|
Java - day9 (0) | 2022.02.28 |
Java - day7 (0) | 2022.02.23 |
Java - day6 (0) | 2022.02.22 |
Java - day5 (0) | 2022.02.21 |