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를 공부한 적이 없다구요, 윤성우)





오늘 2단계, 3단계의 전화번호 관리 프로그램을 업그레이드 시켰다. !!

:)

먼저
2단계 업그레이드 조건은
오늘 공부한 콘솔입력을 통해
사용자로부터 데이터를 입력받아 전화번호 관리 데이터들을 만드는 것이다.

먼저 main 메소드를 중심으로 내용들을 설계해 보았고
필요한 메소드가 무엇인지 체크하면서 시작했다.

흐름은
크게 while(true)으로 진행 할 것이다.
사용자가 종료하기 전까지 반복문으로 돌릴 생각이다.

while 안에서
1. 메뉴출력을 한다.
2. 선택을 입력 받는다.
3. 입력에 따라 모드를 바꾼다. (switch 이용)
-> 즉 switch이용할 것이므로  flag용으로 선택변수가 필요하다. 나는 int sel로 설정하였다.
    그러면 sel에 입력받을것이다.
필요 메소드
-> 메뉴 출력,  데이터 입력.

(전화번호 정보 클래스는 1단계에서 만든 것을 사용할 것이다.)

메뉴 출력 메소드는 println으로 작성했다.

데이터 입력 메소드는 각각의 정보입력에 따라 문자열을 생성하여 그 곳으로 집어 넣고
이 정보들로 전화번호 정보 클래스로 인스턴스를 만든다.


(작성코드.)


윗부분에는 전에 작성했던 전화번호 정보 클래스가 있다.

실행 결과



(결과)


여기에 조금 추가한것은..
왠지 생년월일 입력해주세요에 강요가 묻어나는 것 같았다.
몰라도 입력이 가능하게 만들어 놨으니
생년월일을 안써도 된다는 문구만 더 추가했다.


(추가 수정 코드)


(만족 스러운 2단계 업그레이드 버전)


모를때 그냥 엔터로 입력을 넘겨도 정보가 저장되는 것을 확인 할 수 있다.

2단계까지 업그레이드를 성공시켰다.

작성 풀 코드

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

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

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 PhoneManage2
{
 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. 사용종료.");
 }

 public static void inputData()
 {
    System.out.print("이름을 입력해주세요 :");   // 개행하지 않기위해 그냥 print 메소드를 사용함.
    String name = keyboard.nextLine();           // 입력을 엔터로 종료하기 위해.
    System.out.print("전화번호를 입력해주세요 :");
    String phoneNum = keyboard.nextLine();
    System.out.print("생년월일을 입력해주세요(모른다면 그냥 넘어가도 좋습니다.) : ");
    String birth = keyboard.nextLine();
 
    PhoneInfo newInfo = new PhoneInfo(name, phoneNum, birth);
    System.out.println("\n\n입력된 정보를 확인해 주세요.");
    newInfo.showPhoneInfo();
 }
   
 public static void main(String[] args)
 {
    int sel;     // 선택 변수

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

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

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


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



오늘 공부는 JAVA에서 입력과 출력이다.
오늘 공부로서
이제 프로그램 콘솔창에서 직접 입력을 넣을 수 있게 됬다.

먼저 콘솔 출력부터 살펴보면,
우리가 전까지 쓰던


System.out.println(" ");

으로 사용했는데 이 것과 .print 둘 다 가능하다.
println은 문자열을 출력하고 개행(다음행으로 넘어감)처리가 된다.
print는 문자열을 출력하고 개행되지 않는다.

+ 문자열 조합 출력

System.out.printf("%d", 12);

12가 출력되는 문장이다. 이 구성은 C와 같다. C에서의 printf의 기능과 같다.

콘솔의 입력!
입력은 자바에서 원래 복잡한 기능이었으나,
자바 버전 5.0 이후로 이에 대한 대안이 나왔다. :)

바로 Scanner 클래스를 이용한 것인데, 먼저 방법은

Scanner sc = new Scanner(System.in);
int num1 = sc.nextInt();

위 코드는 사용자에게 입력을 받은 정수를 num1 에 저장하는 문장이다.
먼저 sc는 참조 변수이다. scanner 인스턴스를 만들어 입력을 받고
인스턴스의 nextInt 메소드를 이용하여 num1로 넘긴다.

Scanner의 주요 메소드들이다.
- public boolean nextBoolean()
- public byte nextByte()
- public short nextShort()
- public int nextInt()
-public long nextLong()
- public float nextFloat()
- public double nextDouble()
- public String nextLine()
-> nextLine()은 문자열의 끝을 enter입력을 통해서 종료를 표시한다.
나머지는 자료형의 입력에 따라 나누어진다.

(콘솔 입력 코드)


(결과화면)


위 결과를 보면 콘솔 입력이 구분되는 기준을 이해할 수 있다.
보면 처음에 1 엔터 2 엔터 3 입력하였을 때, 1, 2, 3 이 입력되었고
엔터도, 스페이스바도 치지 않았을 때 123 이 입력,
엔터후 2 입력했을 때 2, 스페이스바 후 3입력했을 때 3...

입력 콘솔에서 모든 공백이 데이터를 구분하는 기준이 된다.

그 다음으로서는 배열을 공부했다. 전에 학교 자료구조수업때 배열을 공부했었는데
내용은 그와 같다. C에서의 배열과 같다는 이야기다.
자바에서 배열의 특징은
배열도 인스턴스라는 것이다.
즉,!
배열을 생성할 때
다른 인스턴스를 생성하던 것처럼 new 를 포함해 생성해야된다는 점이다.
(하지만 꼭 new를 안써도 { } 중괄호를 이용해 생성할 수 도 잇다.)
선언은


int[] ref = new int[5];


이렇게 선언된 배열은 정수형 크기는 5인 배열을 선언한 것이다. 그렇게 되면 메모리 상에 정수형 크기 5인 배열의 공간이 확보된다. 그리고 ref에는 그 주소값이 들어가게 되는것이다. 즉 ref는 여기서 참조 변수이다.

문제 13-1
사용자로부터 입력 받은 수 중에 최대값과 최소값을 구하는 프로그램을 작성하세요.


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

import java.util.Scanner;

class Problem131
{
 public static int[] insertData()
 {
    Scanner keyboard = new Scanner(System.in);
 
    int[] arr = new int[10];     // 들어올 변수 선언

    for(int i=0; i<arr.length; i++)
    {
  System.out.printf("정수를 입력해 주세요.(%d개)", arr.length-i);
  arr[i] = keyboard.nextInt();
    }
    return arr;
 }


 public static int minValue(int[] arr)
 {
    int min = arr[0];

    for(int i = 1; i<arr.length; i++)
    {
  if(min>arr[i])
     min = arr[i];
    }
    return min;
 }

 public static int maxValue(int[] arr)
 {
    int max = arr[0];

    for(int i =1; i<arr.length; i++)
    {
  if(max<arr[i])
     max = arr[i];
    }
    return max;
 }

 public static void main(String[] args)
 {
    int[] arr = new int[10];

    System.out.println("10개의 정수 중 최대,최소값 구하기 프로그램 시작");
    arr = insertData();
   
    System.out.println("최대값은 : " + maxValue(arr));
    System.out.println("최소값은 : " + minValue(arr));
 }
}

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


작성한 코드이다.

클래스를 하나로 만들었고, main 메소드로 실행을 한다.
그리고 동작에 필요한 3개의 메소드들을 작성하였다.
(입력, 최대값구하기, 최소값구하기)

동작 확인

(문제13-1 결과)


배열은 10개로 지정했으므로 10개의 정수를 입력 받게 시작했다. 그리고 출력에서 몇개 남았는지 헷갈릴것 같아서 () 안에 몇개를 더 입력해야하는지 출력하였다.

최대 , 최소값 나온 것을 확인 할 수 있다. :)

for-each문
-> 자바 버전 5.0 이후부터 추가된것이다.

배열의 모든 값들에 대해 반복할 때 사용된다.
예를 들면 어떤 배열의 값들에 모두 1을 더한다든지 이런 데 사용된다.

예)


for(int e : arr)

        e++;


위와 같이 작성하면 모든 배열에 1을 더할 수 있다.

여기서 arr은 배열 이름이다. e는 모든 요소들을 지칭하는 변수로 나타내어진다.
(*그러나 이 구문이 끝나고 나면 변경 결과는 적용되지 않는다. 다시말하면 저 문장이 끝나고 다른 곳에서 저 배열을 확인하면 1이 증가되있지 않다.)

그러므로 배열의 내용을 바꾸지 못하지만  탐색같은 것을 할 때 더 유용하게 활용 될 수 있다.


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







+ Recent posts