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?
'클라우드 기반 웹 개발자 과정 공부 > JAVA' 카테고리의 다른 글
190425_Day14 복습, 이벤트처리 (0) | 2019.04.25 |
---|---|
190424_Day13 복습, 예외처리, 오버라이딩, 내부클래스 (0) | 2019.04.24 |
190422_Day11 복습, String, Vector (0) | 2019.04.22 |
190519_Day10 복습, 미션풀이, not연산자, NullPointException, String (0) | 2019.04.19 |
190118_Day9 복습, 삼항연산자, 클래스 객체 비교, 오토박싱 언박싱 (0) | 2019.04.18 |