OpenFrameWork

오픈프레임워크_Day13

px 2015. 4. 20. 11:21
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
예외처리 -> IO -> Thread -> AWT,Swing -> Network -> DB -> JDBC  / JAVA END
HTML, JSP, Javascript, 
다음주 중에 시험을 볼 것임
시험 범위는 Thread까지, 매주 월요일 인터뷰 한 내용에서 나옴
----------------------------------- 
예외처리
예외가 발생했을 때 예외에 대한 제어권을 시스템(JVM)이 아니라
개발자가 가질 수 있게 하는 방법

에러 - 하드웨어에서 발생된 문제점
실행이 되다가 문제가 발생하면 JVM이 처리를 해서 돌려줬음
이때 발생하는 문제는 예기치 못한 에러임, 컴파일 에러나 그런 문제가 아님
- 개발자 입장에서는 당연한 상황인데, 사용자는 문제메세지를 보면
불안감을 야기시키고, 신뢰감을 떨어뜨림
- 문제가 발생하면 실행 주도권을 JVM이 가져가서 강제로 프로그램이 종료됨
더 이상 프로그램이 실행되지 못함. 반드시 실행 되어야할 코드를 실행 못함
- 자바에서는 필수 기능임


1. why
     1) 예외가 발생했을 때 메세지에 대한 표현 문제
     2) 프로그램의 비정상적인 종료를 방지

2. 주요키워드
     1) try  -> block(중괄호) -> catch랑 같이 써야함
     2) catch -> block(중괄호) -> try랑 같이 써야함
     3) throw -> block(중괄호) 
     4) throws
     5) finally

3. try{
      ... // try안에 코드는 내용을 감시함, 예외를 잡을 수 있는 영역, 여기 있는 것만 잡음
   }cath(예외 타입 변수){
      ... // 감시된 내용에 문제가 있으면 처리를 하는 곳
   }

자바에서는 모든 예외 상황에 대해서 클래스로 만들어 놓았음 
그래서 예외 타입은 해당 클래스를 넣음
try안에서 예외가 발생되면 해당 문제에 대해서 예외타입 변수에 변수가 해당 문제에 대해서 받음


try안에는 한가지 예외가 아니라 다양한 에러가 발생할 수 있음

또한 해당 예외보다 부모의 예외가 잡을 수도 있음

4. 예외 객체 계층도
Throwable 최상위 부모?
     - 중요 메서드
          getMessage()
          printStackTrace()
자식 2개  
          Error  -> 하드웨어 문제, 개발자가 쓸일 거이 없음
          Exception
               RuntimeException -> 실행 중간에 예외, 이 클래스 및 자식들은 예외를 해도 되고, 안해도 되
                                   이 클래스 및 자식 클래스를 제외하고 나머지는 전부 Excetion처리를 해야함

광범위하게 에러를 잡으려면 부모 클래스를 사용하면 되는데
그렇게 되면 어떤 에러인지 알 수 없음
그래서 try,catch에서는 가까운 부분에 하위 클래스를 사용해서 잡고
먼 부분에서는 상위 클래스로 잡으면 되나?


5. throw
     1) 예외 객체(인스턴스)를 (일부러) 던진다. 
               - 일부러 예외 처리를 하는 경우
                 1. 예외 처리를 했는데 예외처리가 되는지 보려고 사용, TEST 용도
                 2. 예외 처리를 다른 곳에서 하기 위해서 사용
                 3. 코드의 진행 상황을 다른 곳으로 변경하기 위해서?
     2) 예외를 하나만 던질 수 있다.
     3) 반드시 블럭안에서만 사용 가능

6. throws               
     1) 예외 클래스들을 던진다.
     2) 예외를 여러개 던질 수 있다.
     3) 반드시 블럭(메서드) 밖에서만 사용 가능
               - 사용 목적
                    대신 처리해달라는 의미로 던짐, 내가 처리 못하니까, 내가 하기 싫으니까?

7. finally{}
          1) 반드시 try/catch와 함께 사용해야 한다
          2) 반드시 실행되는 구역, 실행이 보장
----------------------------------- 
IO(input output)

1. Stream 구조
          1) 단방향
          2) 원칙적으로 순차적
               예외적으로 랜덤하게 접근가능
          3) 지연발생가능 
               항상 일정하게 똑같이 처리되지 않는다
          4) 어떤 장치를 사용하던 간에 사용법은 거의 동일

2. java.io -> nio

3. 자바에서 구현한 Stream 클래스
     실제로는 ByteStream으로 전달되고 ByteStream 제외한 나머지는 사람이 처리하기 좋게 처리해줌
          1) ByteStream -> 1byte씩 io, 모든 기계장치가 사용하는 방식
                    InputStream : read()
                    OutputStream : write()

          2) CharacterStream -> 한문자씩 io, 영문자외에 다른 문자를 주고 받기 위해서 만듬
                                Filter 클래스 (클래스를 포장해서 좀 더 확장해서 쓸 수 있게 해줌)
                    Reader : read()
                    Writer : write()

          3) PrintStream (출력만을 위한 방식, 출력을 쉽고 편하게 지원) : print(), println()
             PrintWriter는 PrintStream 보다 더 편하게 지원

* 어떤 장치로 부터 IO를 하는지는 클래스 이름을 보면 알 수 있음

Wrapper Class vs Filter Class
Wrapper -> 클래스가 아닌 애들을 클래스 처럼
Filter -> 클래스를 포장해서 확장해서 쓸 수 있게 해줌

4. ByteStream
          1) FileInputStream, FileOutputStream
          2) DataInputStream, DataOutputStream
기본 데이터 타입을 한번에 주고 받을 수 있게 도와주는 ByteStream
Persistence 지속성 , 데이터의 영원히 저장하는 방법 -> HDD 저장, 파일 저장

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



----------------------------------- 
----------------------------------- 
----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
----------------------------------- 
----------------------------------- 
----------------------------------- 
----------------------------------- 
###################################
3. 소스코드
-----------------------------------
3-1
/day12/src/exception/ExcTest1.java

package exception;
public class ExcTest1 {
    public static void main(String[] args) {
        // TODO 예외처리 첫번째 예제
        int[] arr1 = new int[3];
        System.out.println("첫번째 예외처리 테스트...");
        
        //#1
        //인스턴스는 실행할때 생성이 됨, 컴파일 할때 문제가 발생하지 않음        
        //개발자 입장에서는 어떤 문제가 있는지 알려줘서 매우 좋으나
        //사용자 입장에서는 무슨 문제가 있는 것으로 보임
        //arr1[7] = 100;
        
        //#2
        /*
        try {
            arr1[7] = 100;
        } catch (java.lang.ArrayIndexOutOfBoundsException err) {
            System.out.println("배열의 범위를 벗어났다.");
        }
        */
        
        //#3
        /*
        try {
            arr1[2] = 100;
            int i = 10 / 0;
        } catch (ArrayIndexOutOfBoundsException err) {
            System.out.println("배열의 범위를 벗어났다.");
        } catch (ArithmeticException err) {
            System.out.println("연산을 그런식으로 하면 안됩니다.");
        } catch (Exception err) {
            System.out.println("일반 오류 입니다.");
        }
        */
        
        //#4
        try {
            arr1[2= 100;
            int i = 10 / 0;
        } catch (ArrayIndexOutOfBoundsException err) {
            System.out.println("배열의 범위를 벗어났다.");
        } catch (ArithmeticException err) {
            System.out.println("연산을 그런식으로 하면 안됩니다.");
            
            //구체적인 에러메세지를 toString메서드를 사용해서 사용 가능
            System.out.println(err);
            //System.out.println(err.toString());
        } catch (Exception err) {
            System.out.println("일반 오류 입니다.");
        }
 
        System.out.println("이 문장이 보이는가?");
    }
}

-----------------------------------
3-2 
/day12/src/exception/ExcTest2.java

package exception;
import java.io.IOException;
public class ExcTest2 {
    public static void main(String[] args) {
        // TODO 반드시 예외처리를 해야하는 경우
        System.out.println("한 문자 입력 :");
        //#1
        //char input = (char)System.in.read();
        
        //#2
        //try안에서 쓸 변수들은 미리 선언하고 초기화 해줘야 해야함
        //try안에서 선언을 하면 거기서 밖에 못쓰기 때문에 문제가 생긴다
        char input = ' '
        try {
            input = (char)System.in.read();
        } catch (IOException e) {
            System.out.println("입력에 문제 발생");
        }
        System.out.println("당신이 입력한 문자는 "+input+"입니다.");        
    }
}
 
----------------------------------- 
3-3
/day12/src/exception/ThrowTest.java

package exception;
public class ThrowTest {
    public static void main(String[] args) {
        // TODO throw 테스트
        try {
            System.out.println("여기는 try블럭 내부...");
            //아래와 같이 예외 인스턴스를 생성해서 예외를 발생
            //#2
            throw new ArithmeticException("이것은 테스트야~");
            
            //#1
            //ArithmeticException air = new ArithmeticException();
            //throw air;
        } catch (ArithmeticException e) {
            System.out.println("Arithmetic 예외처리");
            
            //예외처리시 메세지 전달 가능
            System.out.println(e.getMessage());
        }
        System.out.println("try/catch가 끝난 후...");
    }
}

----------------------------------- 
3-4
/day12/src/exception/ThrowsTest.java

package exception;
public class ThrowsTest {
    //#4 예외를 여러개 처리 할 때 throws에서 두개 던짐
    //void second() throws ArithmeticException, IOException{
    //void second() throws ArithmeticException, ArrayIndexOutOfBoundsException{
    //ArrayIndexOutOfBoundsException는 아래코드에서 실제로 예외가 발생하지 않은 에러고
    //처리해줘도 되고 안해줘도 되는 예외임
    void second() throws ArithmeticException, ArrayIndexOutOfBoundsException{
        System.out.println("second 호출");
        //#1 예외가 발생했다고 가정, 자신이 처리를 못하는 상황
        //#1 second를 호출한 곳에서 예외를 처리해 줘야함
        //#1 예외 처리 상황을 위해서 예외를 발생 시킴
        throw new ArithmeticException();
    }    
    void first(){
        System.out.println("firsts 호출");
        //#2 만약 second의 예외를 처리 하지 않는다면?
        //#2 first가 안하면 first를 호출한 main에서 처리를 해야함
        //#2 반드시 누군가는 처리를 해줘야함
        second();                
        //#1
        /*
        try {
            second();
        } catch (ArithmeticException e) {
            System.out.println("first에서 예외 처리");
        }
        */
    }
    public static void main(String[] args) {
        // TODO throws 테스트
        ThrowsTest obj = new ThrowsTest();
        
        //#3 main도 예외 처리를 안하면?
        //public static void main(String[] args) throws ArithmeticException{
        //jvm이 처리를 하게 됨
        //obj.first();
        
        //#2        
        try {
            obj.first();
        } catch (ArithmeticException e) {
            System.out.println("main에서 예외 처리");
            //#5 어디에서 어떤 에러가 났는지 추적 할 수 있다.
            e.printStackTrace();
        }            
    }
}

----------------------------------- 
3-5
/day12/src/exception/FinallyTest.java

package exception;
public class FinallyTest {
    public static void main(String[] args) {
        // TODO finally 테스트
        int[] arr1 = new int[3];
        System.out.println("finally 테스트...");
        try {
            arr1[7= 100;
        } catch (ArrayIndexOutOfBoundsException err) {
            System.out.println("배열의 범위를 벗어났다.");
            //#1 예외가 발생했을때 더 이상 진행을 하면 안 될때
            //return;
            
            //#2 finally가 실행되지 않는 경우가 있음, 유일한 예외
            //#2 어떤 이유로 종료 되었는지 알려주는 용도로 0 과 같은 값을 넣음
            System.exit(0);
        } finally{
            //#1 어떤 일이 있어도 반드시 실행이 됨
            System.out.println("여기는 반드시 실행되는 영역이다.");
        }
        
        //#1 굳이 finally를 쓰지 않아도 아래 문장이 실행됨
        //#1 예외가 발생했을때 더 이상 진행을 하면 안 될때
        //#1 사용자로 부터 입력을 받아야하는데 못받으면, 그냥 프로그램을 종료해야 하는 경우가 있음
        
        System.out.println("이 문장이 보이는가?");
    }
}

----------------------------------- 
3-6
/day12/src/io/bytestream/ByteTest1.java

package io.bytestream;
import java.io.IOException;
public class ByteTest1 {
    public static void main(String[] args) throws IOException {
        // TODO ByteStream 예제 첫번째 예제
        //#1 한글 입력 안되는 것 확인,cmd 창에서 
        System.out.print("10개의 문자 입력 : ");
        byte data[] = new byte[10];
        System.in.read(data);        
        for (int i = 0; i < data.length; i++) {
            System.out.print((char)data[i]);
        }
    }
}

----------------------------------- 
3-7
/day12/src/io/bytestream/ByteTest2.java

package io.bytestream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class ByteTest2 {
    //#2 bytestream인지 알 수 있는 증거를 보여줄 수 있는 코드를 만들어 보자
    //#2 키보드 주소를 넘겨준다
    //#2 InputStream인 것을 보고 ByteStream임을 알 수 있다
    //#2 InputStream은 ByteStream의 한 종류이기 때문이다
    /*
    static void streamTest(InputStream is) throws IOException{
        int input = 0;
        while(true){
            input = is.read();
            //-1은 ctrl + z  의 조합으로 전달되는 값
            if(-1 == input)
                break;
            System.out.print((char)input);            
        }
    }
    */
    //#3 추가적으로 모니터 장치는 어떻게 받을것인가?
    static void streamTest(InputStream is, OutputStream os) throws IOException{
        int input = 0;
        while(true){
            input = is.read();
            //-1은 ctrl + z  의 조합으로 전달되는 값
            if(-== input)
                break;
            
            //#3 write는 한글이 출력이 됨. print보다 뛰어난 메서드임
            os.write((char)input);
        }
    }
    
    public static void main(String[] args) throws IOException {
        // TODO ByteStream 두번째 예제
        //#1 내가 싫을때까지 계속 입력 받는 예제
        /*
        int input = 0;
        while(true){
            input = System.in.read();
            //-1은 ctrl + z  의 조합으로 전달되는 값
            if(-1 == input)
                break;            
            System.out.print((char)input);
        }
        */
        
        //#2 bytestream인지 알 수 있는 증거를 보여줄 수 있는 코드를 만들어 보자
        //#2 키보드 주소를 넘겨준다        
        //streamTest(System.in);
        
        //#3 추가적으로 모니터 장치는 어떻게 받을것인가?
        streamTest(System.inSystem.out);
    }
}

-----------------------------------
3-8
/day12/src/io/bytestream/FileTest1.java

package io.bytestream;
import java.io.FileInputStream;
import java.io.IOException;
public class FileTest1 {
    public static void main(String[] args) throws IOException {
        // TODO 파일 처리 첫번째 예제
        //#1 파일로부터 입력 받아 콘솔로 출력
        
        //#1 아래와 같이 경로에는 역슬래시로 역슬래시 무효화 해줘야함
        //#1 아래 코드는 HDD에서 FILE을 찾아서 메모리에 LOAD(적재) 한다는 내용임
        FileInputStream fin = new FileInputStream("F:\\study\\test.txt");
        
        int input = 0;
        while(true){
            input = fin.read();
            
            //#1 -1은 File의 끝을 의미
            if(-== input)
                break;
            System.out.write((char)input);
        }
        
        //#1 이러한 장치들은 다 사용한 뒤에 닫아줘야함
        fin.close();
    }
}

-----------------------------------
3-9
/day12/src/io/bytestream/FileTest2.java

package io.bytestream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileTest2 {
    public static void main(String[] args) throws IOException{
        // TODO 키보드로 부터 입력받아 파일로 출력
        //#1 cmd - copy con text1.txt  엔터 후 글 입력 ctrl+z 입력 하면 글 마지막을 알려주고 엔터
        //#1 copy con 프로그램을 만들어 보자
        //#2 new FileOutputStream("F:\\study\\test1.txt",true) true는 append 모드로 덧붙여 쓰기가 됨
        FileOutputStream fout = new FileOutputStream("F:\\study\\test1.txt",true);
        int input = 0;
        while(true){
            input = System.in.read();
            
            if(-== input)
                break;
            fout.write((char)input);
        }
        fout.close();
    }
}

-----------------------------------
3-10
/day12/src/io/bytestream/DataTest.java

만들고 수업 안함
-----------------------------------
----------------------------------- 
###################################
4. 과제
-----------------------------------
4-1
/*
* copy a.txt b.txt
* a.txt 를 b.txt로 복사하는 프로그램임
* 이 프로그램을 만드시오
*
* java jcopy a.txt b.txt
* a.txt는 미리 만들어 놓아야 하고
* b.txt는 안만들어 놓아도 동작하도록 만들어라
*/
----------------------------------- 
----------------------------------- 
----------------------------------- 
----------------------------------- 
###################################
5. 과제 해결
-----------------------------------
5-1
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Problem {
     public static void main(String[] args) throws IOException {
          FileInputStream fin = new FileInputStream(args[0]);
          FileOutputStream fout = new FileOutputStream(args[1]);         
          int input = 0;
          while(true){
               input = fin.read();
               if(-1 == input)
                    break;
               fout.write((char)input);
          }         
          fin.close();         
          fout.close();         
     }
}
-----------------------------------
-----------------------------------
-----------------------------------
-----------------------------------
-----------------------------------