Java 11일차

소윤정·2021년 6월 7일
0

JAVA

목록 보기
10/15
  1. 예외처리
  2. 파일 클래스(스트림)

예외 처리(⭐️⭐️)

  • 예외가 발생할 것을 대비하여 미리 예측해 이를 소스상에서 제어하고 처리하도록 만드는 것
  • 예외란 error의 일종이며, 발생시 시스템 및 프로그램을 불능상태로 만든다.
  1. 오류(error)

    • 자바 컴파일러는 문법 오류를 발생
    • 문법이 맞게 작성되었다 하더라도 프로그램을 실행하면서 예상하지 못한 오류가 발생할 수 있음

  2. 예외(exception)

    • 프로그램 실행 중 비정상적으로 종료
    • 예측할 수 있는 예외, 예측하지 못하는 예외
    • 런타임시 발생
    예외가 발생하는 원인
    1. 사용자가 잘못된 데이터를 입력하는 경우
    2. 개발자가 로직이나 계산을 잘못 작성한 경우
    3. 하드웨어나 네트워크가 제대로 동작하지 못하는 경우
    4. 악의적으로 잘못된 연산을 요구하거나 시스템을 공격

예외의 종류

  1. Exception(일반 예외)
  2. RuntimeException(실행 예외)
checked ExceptionUnchecked Exception
반드시 예외를 처리명시적인 처리를 강제하지 않음
컴파일 단계실행 단계
Exception의 상속 받은 하위 클래스 중 Runtime Exception을 제외한 모든 예외RuntimeException 하위 예외
Roll-back 하지 않음Roll - back 함
checked Exception 과 Unckecked Exception 차이점?
  • "꼭! 처리 해야 하는가.."

예외 처리 코드

try {
	실제 코드가 들어가는 곳으로 예외 Exception이 발생할 가능성이 있는 코드
}
catch(예외 객체타입 참조변수) {
	try 블록에서 Exception이 발생하면 catch로 오게됨.
	여기에 작성한 코드가 처리됨
}
finally {
	try 블록에서 Exception 발생의 유무와 상관없이 무조건 실행되는 코드(옵션, 생략 가능)
}

코드 진행 방법

  1. 예외가 발생하지 않음
    try → finally
  2. 예외가 발생함
    try → catch → finally

강제로 예외를 발생 시키는 방법

Exception 참조변수 = new Exception("예외가 발생하면 출력될 문자열");
throw 참조변수; // ← 예외 발생!
  • throw
    - 강제로 예외를 발생 시키고자 할때 사용
    • 현재 메소드의 예외를 처리한 후 상위 메소드에 예외 정보를 전달함
  • throws
    - 현재 메소드에서 자신을 호출한 상위 메소드로 예외를 발생시킴
    - 사용하는 메소드를 호출한 상위 메소드에서 예외처리에 대한 책임을 맡김
    - 예외의 책임을 전가

java.io

File 클래스

File 참조변수 = new File(파일 주소 또는 파일 이름)

  • 파일 자체를 다룸
  • 입출력 작업 이외에 파일과 디렉토리에 관한 작업
import java.io.File;

public class File1 {
    public static void main(String[] args) {
        try{
            File file1 = new File("/Users/soyounjeong/Desktop/develop/yoon/JAVA/Day11/input1.txt");
            System.out.println(file1.exists()); // 파일 존재여부
            System.out.println(file1.isDirectory()); // 폴더 존재여부
            System.out.println(file1.isFile()); // 파일이니?
            System.out.println(file1.length()); // 파일에서 한글 바이트 3byte, 영어 특수문자 숫자는 1byte

            File dir = new File("/Users/soyounjeong/Desktop/develop/yoon/JAVA/Day11/new"); // 폴더만들기
            dir.mkdir();

            File file2 = new File(dir,"input2.txt"); // 폴더안에 파일을 만들게 됨
            file2.createNewFile();

            File file3 = new File("input3.txt");
            file2.renameTo(file3);

            System.out.println(file3.getPath()); // input3.txt
            System.out.println(file3.getAbsolutePath()); // 전체 경로 출력
            System.out.println(file3.getAbsoluteFile()); // 경로가 없으면 파일 객체도 생성
            System.out.println(file3.getParent()); // 생성자에 Parent 주소가 없으면 null

        } catch (Exception e){
            System.out.println("파일 및 폴더 생성에 실패 했습니다.");
        }

    }
}
  • exists() : 파일이 실제 존재하는지 여부
  • isDirectory() : 디렉토리인지 판단
  • isFile() : 파일인지 판단
  • length() : 파일의 길이(byte) 반환(한글은 3byte, 영어/특수문자/띄어쓰기 1byte)

스트림(Stream)

  • 파일이나 콘솔의 입출력을 직접 다루지 않고, 스트림이라는 흐름을 통해 다루게 된다.
  • 실제의 입력이나 출력이 표현된 데이터의 흐름을 의미
  • 운영체제에 의해 생성되는 가상의 연결고리를 의미하고 중간 매개자 역할을 함

    ⇒ 데이터를 직접 보내는 것이 아니라 스트림을 통해 전달.
    데이터가 오는것도 스트림을 통해 도착하고 필요에 따라 프로그램에게 데이터를 전달.

FileInputStream 클래스

  • java.io의 가장 기본 파일 입출력 클래스
  • 입력 스트림(통로)을 생성해줌.
  • 단점 : 사용하기에는 간단하나, 버퍼를 사용하지 않기 때문에 속도가 느리다.
버퍼(=버퍼링)
  • 데이터를 저장하는 저장소
  • 데이터를 빠르게 볼수 있다.
  • 데이터를 한번에 빠르게 처리할땐 좋으나 실시간으로 사용하려면 버퍼를 사용하는 것에는 좋지 않다.
import java.io.FileInputStream;

public class File2 {
    public static void main(String[] args) {
        byte[] arr1 = new byte[20];
        byte[] arr2 = new byte[20];

        try {
            FileInputStream fi = new FileInputStream("input4.txt");
            System.out.println((char)fi.read()); // read() : 1바이트만 읽어옴

            fi.read(arr1, 0, 5); // 인덱스 0번부터 5번까지 읽음
            for(byte b : arr1){
                System.out.print((char)b + " ");
            }

            fi.read(arr2); // 빈 바이트 배열을 넣어줌
            System.out.println();
            for(byte b : arr2){
                System.out.print((char)b + " ");
            }
            fi.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
  • read() : 스트림을 통해 byte 단위로 데이터를 읽어옴

FileOutputStream 클래스

  • java.io의 가장 기본 파일 입출력 클래스
  • 출력 스트림(통로)을 생성해줌
  • 버퍼를 사용하지 않기 때문에 속도가 느리다.
  • 속도 문제를 해결하기 위해 버퍼를 사용하는 다른 클래스와 같이 사용
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class File3 {
    public static void main(String[] args) {
        String input = "파일을 저장할 주소/input4.txt";
        String output = "파일을 내보낼 주소/ output1.txt";

        FileInputStream fis;
        FileOutputStream fos;

        try{
            fis = new FileInputStream(input); // input 주소 입력
            fos = new FileOutputStream(output);

            int b;
            while((b = fis.read()) != -1){ // fis을 1바이트씩 읽어와서 b에 저장 그리고 나서 -1(데이터를 못가져올때)이 아닌지 판단
                fos.write(b); // fos에 write함
                System.out.print((char) b + " "); // 문자로 강제 변환해서 출력
            }
            fis.close();
            fos.close();

        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

FileReader 클래스

  • FileInputStream과 유사
  • 문자 스트림으로 문자 단위의 바이트 변환 기능을 가지고 있음
  • 바이트 단위가 아닌 문자 단위로 입출력을 수행
import java.io.FileReader;

public class File4 {
    public static void main(String[] args) {
        char[] arr = new char[40];

        try {
            FileReader fr = new FileReader("input1.txt");
            System.out.println((char) fr.read()); // 바이트 단위가 아니라 문자단위로 읽어옴
            // char의 배열 형태로 데이터를 읽어온다.
            fr.read(arr);
            for(char c : arr) {
                System.out.print(c); // 단어 단위로 읽어온다.
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

FileWriter 클래스

  • FileOutputStream과 유사
  • 문자 스트림으로써 문자 단위의 바이트 변환 기능을 가지고 있다.
import java.io.FileWriter;

public class File5 {
    public static void main(String[] args) {
        String str = "Hello Java!!"; // 문자열

        try {
            FileWriter fw = new FileWriter("output2.txt");
            fw.write(str.charAt(0)); // charAt() : 0번에 대한 인덱스를 출력해라.
            fw.write(str);
            fw.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

PrintWriter 클래스

  • 문자열을 출력하는 Writer 속성을 가진 클래스
  • OutputStream의 자식 클래스이며 byte 단위 출력 클래스인 PrintStream의 Print 메소드를 모두 구현하여 사용할 수 있다.
  • 다양한 분야에서 데이터를 쓸 수 있는 클래스로 네트워크, 웹에서 사용 가능하다.
  • 출력 스트림을 정해주면 해당 스트림에 맞춰서 출력되는 클래스
import java.io.FileOutputStream;
import java.io.PrintWriter;

public class File7 {
    public static void main(String[] args) {
        String file1 = "output3.txt";
        String[] arr = {"김사과", "오렌지", "반하나", "이메론"};
        try{
//            FileOutputStream fos = new FileOutputStream(file1);
//            PrintWriter pw = new PrintWriter(new FileOutputStream(fos));

            PrintWriter pw = new PrintWriter(new FileOutputStream(file1)); // PrintWriter는 다양한 분야에서 활용
            for(int i = 0; i < arr.length; i++){
                System.out.print(arr[i] + " ");
                pw.println(arr[i]);
            }
            pw.close();
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

연습문제

Q. 아래 data.txt를 읽어 출력과 같이 프로그램을 작성해보자.
(학점은 평균 기준이며 90점 이상은 A, 80점 이상은 B, 70점이상은 C, 60점 이상은 D, 나머지는 F)

/*
    2020.06.03 과제1 풀이
 */
import java.io.FileInputStream;
import java.util.Scanner;

public class Main1 {
    public static void main(String[] args) {
        String file1 = "data.txt";
        Scanner sc;

        try{
            sc = new Scanner(new FileInputStream(file1));
            while(sc.hasNextLine()){
                String str = sc.nextLine(); // 김사과, 90, 80, 100
                // arr[0] = "김사과"
                // arr[1] = "90"
                // arr[2] = "80"
                // arr[3] = "100"
                String[] arr = str.split(","); //,를 기준으로 자르기
                System.out.println("이름 : " + arr[0]);
                System.out.println("국어점수 : " + arr[1]);
                System.out.println("영어점수 : " + arr[2]);
                System.out.println("수학점수 : " + arr[3]);
                int total = Integer.parseInt(arr[1]) + Integer.parseInt(arr[2]) + Integer.parseInt(arr[3]);
                System.out.println("총점 : " + total);
                int avg = total / 3;
                System.out.println("평균 : " + avg);
                String hakjum = "";
                if(avg >= 90)  hakjum = "A학점";
                else if(avg >= 80)  hakjum = "B학점";
                else if(avg >= 70)  hakjum = "C학점";
                else if(avg >= 60)  hakjum = "D학점";
                if(avg >= 90)  hakjum = "A학점";
                else hakjum = "F학점";
                System.out.println("학점 : "+ hakjum);
                System.out.println();

            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

배운점

아직까진 file클래스는 어려운것같다.조금더 자세하게 공부해야겠다ㅠㅠ

0개의 댓글

관련 채용 정보