190423_Day12 복습, Vector실습, 예외처리


복습

  • Vector

    • 데이터를 담는 바구니

    • 가변길이배열, 저장할 데이터 수 일정치 않을 때

    • 객체(데이터)에 대한 참조를 갖는 배열(모든 자료형을 담을 수 있음)

    • Vector v = new Vector();

    • 클래스 Person =>> 데이터 저장(저장되는 곳 주목)

    • public class Person
      {
      public getName()
      {
          return "나길동"
      }
      }
      Person p = new Person();
      System.out.print(p.getName());
      //으로 출력하면 된다.
      Person [] person = {p};
      System.out.print(person[0].getName());
      //person[0]
      Vecrot<Person> v = new Vector<>();
      v.add(p);
      System.out.print(v.get(0).getName())
  • Vector를 이용하여 사람의 번호, 이름, 나이, 직업 =>> 저장, 조회, 수정, 삭제

    package mission;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    /*
    *  - 반복적인 메뉴출력
    *    - Vector에 추가할 사람정보 입력, 수정할 번호와 사람정보, 삭제할 번호의 입력을 받는다.
    *    - 선택된 언어에 따라 PersonMenu의 메소드를 호출.
    */
    public class PersonMenuTest
    {
    public static void main(String[] args) throws IOException 
    {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        PersonMenu menu = new PersonMenu();
    
    
        String num;
        do 
        {
            System.out.println( " < 사 람 메 뉴 > " );
            System.out.println( "1.추가 2.검색 3.수정 4.삭제 5.종료" );
            System.out.print( "번호 입력 =>>" );
            num = in.readLine();//1~5까지의 문자열 입력
    
            switch ( num ) 
            {
                case "1":
                { 
                    System.out.println( "#추가할 사람" );
                    System.out.print("이름 : ");
                    String name = in.readLine();
                    System.out.print("나이 : ");
                    int age = Integer.parseInt(in.readLine()); 
                    System.out.print("직업 : ");
                    String job = in.readLine();
    
    
    //                    menu.insert(name, age, job); // 메소드 호출 , ()안에는 데이터 넣기//데이터 나열해서 호출
    //                    String []arr = {name, age, job};
    //                    menu.insert(arr); 로 할 수도 있었다~! 문자열들을 배열로 묶어서 전달 호출
    
                    Person p = new Person(0, name, age, job); //no넣을수 없어서 아직...
                    //관련있는 4개의 데이터를 p변수로 묶고
                    menu.insert(p);
                }   
                    break;
                case "2": 
                    menu.select();
    
                    break;
                case "3": 
                    System.out.print("수정할 번호 : ");
                    int no = Integer.parseInt(in.readLine());
                    System.out.print("나 이 : ");
                    int age = Integer.parseInt(in.readLine());
                    System.out.print("직 업 : ");
                    String job = in.readLine();
    
                    //세개의 변수(no,age,job)를 변수명 한개로 묶어주기
    //                    Person p = new Person(no, null, age, job); //이렇게 해도 되고!
                    Person p = new Person(); // 0, null, 0, null
                        p.setNo(no); //no, null, 0, null
                        p.setAge(age); // no, null, age, null
                        p.setJob(job); // no, null, age, job
    
                    menu.update(p);//p넣으면 묶여서 전달된다.
                    break;
                case "4": 
                    System.out.println("#삭제하기");
                    int delNo = Integer.parseInt(in.readLine());
    
                    menu.delete(delNo);
    
    
                    break;
            }
            System.out.println();
    
        }while(!num.equals("5"));
        {
            System.out.println(" == E N D == ");
        }
    }
    
    
    }
    
    /===
    
    package mission;
    
    import java.util.Vector;
    
    /*
    *    - 기능을 정의하는 클래스
    *    - 멤머변수 Vector<Person> persons; // 사람정보를 저장
    *    - int no; // Vector에 입력되는 Person내에 순차적인 번호 부여
    *  - 멤버 메소드(기능메소드) : 추가(insert, create) , 조회(select, find) , 수정(update, modify) , 삭제(delete, remove) <== 데이터 단위[사람]
    *            
    */
    public class PersonMenu 
    {
    Vector<Person> personV; //Person 데이터를 받겠습 ( 데이터 단위는 Person단위로 ), 기본값 null
     int no;
    
    public PersonMenu()
    {
        personV = new Vector<>(); //기본값 null
        //PMT에 넣어도 괜춘, 기본값 0
    }
    
    public void insert(Person p)
    //public void insert(String []arr)
    {
        //벡터에 사람정보를 저장하기 전에, 유일한 번호(no)를 생성해서 p에 전달
    
        p.setNo(++no); // 유일한 번호 부여
        personV.add(p);
    }
    
    public void select()
    {
        System.out.println("사람목록");
        for (int i = 0; i < personV.size(); i++) 
        {
    //            Person p = persons.get(i);
    //            System.out.println(p); //를 줄여서 밑에 껄로
            System.out.println(personV.get(i));
        }
    }
    
    public void update(Person newP)
    {
        for(int i = 0; i < personV.size(); i++)//일치하는 번호 찾기
        {
            //=====
            //Person p.getNo()
    
            //일치하는 번호 ( 수정할 번호 ) 찾기
            Person oldP = personV.get(i); //벡터(데이터저장소)에 저장된 개개의 사람정보
            if( oldP.getNo() == newP.getNo()) // 일치 번호 찾았다면
            {
                //여기다가 set을 해버리면 완전 지워지고 다시 새로 써버리는것이다...
                //수정작업 ( 나이, 직업만 )
                oldP.setAge(newP.getAge());
                oldP.setJob(newP.getJob());
            }
        }
    }
    
    public void delete(int delNo)
    {
        for (int i = 0; i < personV.size(); i++) 
        {
            Person oldP = personV.get(i);
            if(oldP.getNo() == delNo)
            {
                personV.remove(i);
                break;
            }
        }
    }
    }
    
    /===
    
    package mission;
    
    /*
    * 자바빈즈, (서로 관련있는 속성들을 표현, 저장 하는 클래스
    *    - private속성 : 번호 이름 나이 직업
    *    - 생성자(선택사항)
    *    - public 게터메소드 세터메소드
    */
    
    public class Person {
     //속성정의
    private int no;
    private String name;
    private int age;
    private String job;
    
      public Person() {
    
    }
    
    public Person(int no, String name, int age, String job) {
        this.no = no;
        this.name = name;
        this.age = age;
        this.job = job;
    }
    
    public int getNo() {
        return no;
    }
    
    public void setNo(int no) {
        this.no = no;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
    
    public String getJob() {
        return job;
    }
    
    public void setJob(String job) {
        this.job = job;
    }
    
    @Override
    public String toString() {      
        return no+": ["+name+","+age+","+job+"]";
    }
    
    
    }//class Person

예외처리 < Exception >

  • 프로그램 실행 중에 발생하는 예기치 않은 사건
  • 자바는 프로그램 실행 중 발생할 수 있는 예외를 처리할 수 있는 기법 제공
  • 발생하는 모든 예외를 객체로 취급, 예외 관련 클래스 제공
  • 예)
    • 배열의 첨자가 음수값을 가지는 경우
    • 배열 첨자가 배열의 크기를 벗어나는 경우
    • 부적절한 형변환이 일어나는 경우
    • int su = 3.14 // 에러 -> int형에서는 0.14에 대한 표현 불가
    • int su = (int)3.14 // 실행가능, su변수에 3저장
    • double d = 30;
    • double d = 30; //묵시적인 형변환! d변수에 30.0dl wjwkd
    • double d = (double)30; //명시적인 형변환, 값은 같다.
    • (int)”홍길동” //에러발생 : String과 int자료형은 공통점이 없다.
    • (B)A //에러발생한다면 : A클래스와 B클래스간의 상속관계가 없다.
    • (Object)String // 가능하다, 모든 데이터는 최상위 클래스인 Object로 형변환 가능
    • Object ob = (Object)”나길동”; //가능
    • => 부모캐스팅은 보통 생략, Object ob = “나길동”; 이렇게!
    • ob.length() ? (안된다!) , ob는 부모… 자식 레퍼런스 호출 불가!
    • ob.toString() ? (), toString() Object에도 있는걸?, 그럼 toString()메소드는 어떤 클래스의 메소드일까? String!! (오버라이딩메소드이다!)
    • (String)Object =>> 자식캐스팅 : 반드시 명시를 해야 하는 부분!
    • String str = (String)ob;
    • str.length() =>> 3 (O)
    • (Parent)Child데이터 (Child)Parent데이터 =>> 상속관계가 있었을 때만 캐스팅이 가능
  • 입축력시 인터럽트가 발생하는 경우
    • 입출력하기 위해 지정한 파일이 존재하지 않거나 파일 이름이 틀린 경우.
  • throws 는 책임전가… !

<예외처리 구문 형식>

  • 이전의 throws 문은 예외가 발생시 할일에 대해 전가의 뜻을 가짐.

    void gildong() throws IOException
    {
    readLine(); //에러 발생하니 throws추가  
    }
    /*
    =>> gildong()메소드를 실행하다가 만약 IOException이 발생하면 그 상황에 대한 처리를 lime()메소드가 하시오!!
    */
    void lime()
    {
      readLine();
    }
  • try ~ catch문

    • 형식
    try
    {
        1;//1번에서 에러 발생시 2,3번 실행 안함!
        2;
        3;
    //예외가 발생할 가능성이 있는 문장; =>>대체적으로 메소드 호출 문장
    }catch(예외타입 변수명)//변수선언이 들어간다.(int이런 기본타입 말고 , 클래스 타입)
    {
        실제 예외가 발생 한다면 처리할 문장
    }finally{
        //예외발생과 상관 없이 반드시 실행할 문장;
    }
    
    //예외처리 case1) 각각 처리
    try
    {
        AException이 발생할 가능성 있는 문장1;
    }catch(AException e)
    {
        AException 발생시 처리할 문장
    }
    
    try
    {
        BException이 발생할 가능성 있는 문장2;
    
    }catch(BException e)
    {
        BException 발생시 처리할 문장
    }
    
    try
    {
        CException이 발생할 가능성 있는 문장1;
    }catch(CException e)
    {
        CException발생시 처리할 문장
    }
    
    //예외처리 case2) 다중catch를 사용 : 일반적으로 많이 사용
    try
    {
        AException이 발생할 가능성 있는 문장1;
        BException이 발생할 가능성 있는 문장2;
        CException이 발생할 가능성 있는 문장3;
    }catch(AException e){
        AException발생시 처리할 문장;
    }catch(BException e){
        BException발생시 처리할 문장;
    }catch(CException e){
        CException발생시 처리할 문장
    }
    • 다중 catch사용시 주의할 점!

      • 부모 자식 클래스 정의하는 순서에 주의~!

      • 자식클래스에 대한 catch문을 먼저 정의를 해야함!

      • 1번

      • catch(ParentException pe){} //ParentException pe = new ParentException(); , ParentException pe = new ChildException();
      • catch(ChildException ce){} =>> x

      • 2번

      • catch(ChildException ce){}
      • catch(ParentException pe){} =>> o
      • 위에서 1번에서 에러 발생, 결국 Parent에서 자식 에러까지 캐치해버림, 그래서 밑에 캐치문이 실행이 안됨!
      • 차일드와 차일드 비교하고, 넘어감
package j0423;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/*
 * < 자바 I/O 의 4대 클래스 > =>> 추상클래스
 * 
 *          byte단위              문자단위
 * -----------------------------------------------
 *  읽기      InputStream         Reader          =>> 대표 메소드 : read()
 *  쓰기      OutputStream        Writer          =>> 대표 메소드 : write() 
 *  
 */
public class ExceptionTest 
{
    public static void main(String[] args) 
    {
        //텍스트 파일 (a.txt)를 읽어서 그 내용을 콘솔(모니터)에 출력

        try {
            FileReader fr = new FileReader("bin/mission/b.txt"); // src좌표보다는 bin이 더 좋다! 최상위 경로에 넣어놓은 a.txt, FileNotFoundException 에러 발생(자식)
//          System.out.println(fr.read()); //IOException에러 발생 (부모)
//          System.out.println(fr.read()); //IOException에러 발생 (부모)
//          System.out.println(fr.read()); //IOException에러 발생 (부모)
//          System.out.println(fr.read()); //IOException에러 발생 (부모)
//          System.out.println(fr.read()); //IOException에러 발생 (부모) // -1 이 나오면 읽을 문자가 없다는 뜻
            int i ;
            while( ( i=fr.read() ) != -1 )
            {
                System.out.print((char)i);
            }
            System.out.println("\n파일 읽기 성공 :)");
        } catch (FileNotFoundException e) 
        {
            System.out.println("파일경로를 확인하시와요");
//          e.printStackTrace();
        } catch (IOException e) 
        {
            System.out.println("입출력에러가 발생했아와요");
//          e.printStackTrace();
        }

    }
}
궁금상자
    - 벡터안에 배열 ?
    - switch문에 fianl String?

+ Recent posts