3단계로 업그레이드 과정이다.

필요 조건은
그 전 단계버전까지는 데이터가 관리 되지 않았다.
이번 단계의 핵심은 배열로 전화번호 데이터들을 관리하는 것이다.

이렇게 관리되는 데이터들을 이름으로 검색할 수 있고,
또 필요에 따라 삭제 할 수 있는 기능을 추가해야한다.

점점 쓸만한 프로그램이 되가는 느낌이 들어서 좋다. :)

먼저,
main 코드를 중심으로 필요한 메소드와 클래스를 생각해보았다.

아무래도 전화번호들을 관리하는데 인스턴스가 필요해 보였다. 왜냐하면 데이터를 입력받고 검색하고 삭제하고 기능들의 메소드를 메인 클래스에 꾸겨 넣자니 모양새가 안좋았다.

manager라는 인스턴스(객체)를 생성하여 이 놈이 관리하도록
관리자를 만들어야겠다는 생각이 들었다.
또 이 클래스 안에
입력, 검색, 메뉴출력, 삭제 등의 메소드들을 포함시킬 생각이다.

코드를 작성하고 컴파일 도중 에러를 만났다..!


(마주친 에러)


1. reached end of file while parsing 에러

-> 처음에 이게 어떤 오류인지 이해가 안갔다.
내용은 파싱(구문해석)하는 동안에 파일의 끝에 닿았다.
코드를 보니 아직 끝날때가 안됐는데 이미 파일의 끝에 가버렸다는 말이다.
이게 무슨말인지.. 했더니

보통 { }를 잘 안닫아서 생기는 오류였다.
하나하나 검사해보니 } 하나 빠져있었다... ㅜ

수정 후 다시 컴파일을 하였다.


(마주친 에러2)


2. non-static variable registPhone cannot be referenced from a static context 에러
이 에러로 고민을 많이했다..
이유가.. 도통 뭔지 모르겠어서..

내용을 읽어보면 static으로 선언되지 않은 변수는 참조할 수 없다고 설명되있다.
!! ..
전에 내용을 내가 잊고있었다..
다시 책을 뒤져보니..!!!!!
static 메소드에서는 인스턴스 변수에 접근하지 못한다..
static 메소드 내에서는 static 변수나 static 메소드가 아닌 인스턴스 변수나 인스턴스 메소드의 접근이 불가능하다...
이유는 인스턴스는 여러개 생성될 수 있지만 static으로 선언하면 하나를 같이 공유하는 개념이기 때문이다.



(문제 코드.!)


static 메소드가 인스턴스 변수인 registPhone에 접근하려 했다..
-> 내가 static을 쓴 이유는 메뉴를 보이고 데이터 입력 등 이런 메소드를 manager 인스턴스를 안만들고 바로 쓰고 싶어서 static으로 선언했는데,
사실 생각해보면 manager 인스턴스를 한번만 만들고 그 인스턴스로 사용하기 때문에 상관없는 거였다.

registPhonestatic을 선언할 것인가 static을 메소드에서 제거할 것인가 고민 후 static 선언을 지웠다.

그 후 출력



(만족스러운 화면)


아주~ 잘됬다.!! :)

3단계까지 업그레이드에 성공하였다 :)

작성 풀 코드

----------------------------------------------------------------------------------------------

// 단계별 프로젝트 03
// 전화번호 관리 프로그램

import java.util.Scanner;

class PhoneInfo
{
 String name;
 String phoneNum;
 String birth;

 public PhoneInfo(String name, String phoneNum, String birth)
 {
    this.name = name;
    this.phoneNum = phoneNum;
    this.birth = birth;
 }
 public PhoneInfo(String name, String phoneNum)
 {
    this(name, phoneNum, null);
 }

 public void showPhoneInfo()
 {
    System.out.println("name : " + name);
    System.out.println("phone : " + phoneNum);
    if(birth == null)
  System.out.println("birthday :");
    else
  System.out.println("birthday : " + birth);
 }
}

class PhoneManager
{
 final int MAX = 100;
 PhoneInfo[] registPhone = new PhoneInfo[MAX];
 int cnt = 0;
 public static Scanner keyboard = new Scanner(System.in);

 public static void showMenu()
 {
    System.out.println("\n");  // 공백 띄우기.
    System.out.println("메뉴를 선택하세요.");
    System.out.println("1. 전화번호추가하기");
    System.out.println("2. 검색하기.");
    System.out.println("3. 삭제하기.");
    System.out.println("4. 사용종료.");
 }
 
 public void inputData()
 {
    System.out.print("이름을 입력해주세요 :");   // 개행하지 않기위해 그냥 print 메소드를 사용함.
    String name = keyboard.nextLine();           // 입력을 엔터로 종료하기 위해.
    System.out.print("전화번호를 입력해주세요 :");
    String phoneNum = keyboard.nextLine();
    System.out.print("생년월일을 입력해주세요(모른다면 그냥 넘어가도 좋습니다.) : ");
    String birth = keyboard.nextLine();
 
    registPhone[cnt] = new PhoneInfo(name, phoneNum, birth);

    System.out.println("\n\n입력된 정보를 확인해 주세요.");
    registPhone[cnt].showPhoneInfo();
    cnt++;
 }
 
 public void searchData()
 {
    System.out.println("검색을 시작합니다.");

    System.out.print("이름 : ");
    String name = keyboard.nextLine();

    int indx = search(name);    // 검색 메소드 이용.
    if(indx < 0)
    {
       System.out.println("해당 이름의 자료가 없습니다.\n");
    }
    else
    {
       registPhone[indx].showPhoneInfo();
       System.out.println("검색하였습니다.\n");
    }
 }

 public void delData()
 {
    System.out.print("삭제하실 분의 이름을 입력해 주세요 : ");
    String name = keyboard.nextLine();

    int indx = search(name);
    if(indx <0)
    {
       System.out.println("해당 이름의 자료가 없습니다.\n");
    }
    else
    {
       for(int idx = indx; idx<(cnt-1); idx++)
  registPhone[idx] = registPhone[idx+1];

       cnt--;
    }
 }

 private int search(String name)
 {
    for(int idx=0; idx<cnt; idx++)
    {
  PhoneInfo pointInfo = registPhone[idx];
  if(name.compareTo(pointInfo.name) == 0)
     return idx;
    }
    return -1;   // 못찾았을 경우
 }
}
 
class PhoneManage3
{
    
 public static void main(String[] args)
 {
    int sel;     // 선택 변수
    PhoneManager manager = new PhoneManager();   //인스턴스 생성 (번호 데이터 관리)


    while(true)            // 사용자의 종료 입력전까지 반복.
    {
  manager.showMenu();
  sel = manager.keyboard.nextInt();
  manager.keyboard.nextLine();  // 남아있는 Enter입력 버리기.

  switch(sel)
  {
     case 1 :
        manager.inputData();
        break;
     case 2:
        manager.searchData();
        break;
     case 3:
        manager.delData();
        break;
     case 4 :
        System.out.println("시스템 종료");
        return;    // 반복문 나가기
  }
    }
 }
}

----------------------------------------------------------------------------------------------


(*참조 - 난 정말 JAVA를 공부한 적이 없다구요, 윤성우)





+ Recent posts